在实时应用程序中,始终需要以XML格式生成从数据库中选择的数据。
使用Oracle,使用内置包DBMS_XMLGEN可以更轻松地生成XML结构化数据。 该包可用于将SELECT查询的OUTPUT转换为XML格式。
以下代码可用于生成XML格式的SELECT Query OUTPUT:
DECLARE
my_context NUMBER := 0;
sample_xml_output VARCHAR2(32767);
data_size NUMBER := 0;
data_chunk NUMBER := 0;
offset NUMBER := 0;
BEGIN
-- Create a New Context
my_context:= DBMS_XMLGEN.NEWCONTEXT ('SELECT * FROM emp order by 1');
DBMS_OUTPUT.PUT_LINE('My New Context ID is:'||my_context);
-- Set the Root Element
DBMS_XMLGEN.SETROWSETTAG(my_context,'EMP_DETAILS');
-- Set the Row Element
DBMS_XMLGEN.SETROWTAG(my_context,'EMP');
-- Generate XML Output
SELECT DBMS_XMLGEN.GETXML(my_context) INTO sample_xml_output FROM DUAL;
data_chunk := LENGTH(sample_xml_output);
offset := 0;
data_size := 200;
-- Print 200 Chunk of data on Screen
LOOP
DBMS_OUTPUT.PUT_LINE(SUBSTR(sample_xml_output,offset + 1,data_size));
offset:= offset + data_size;
data_size := LEAST(200,data_chunk - data_size);
data_chunk := data_chunk - data_size;
EXIT WHEN data_chunk <= 0;
END LOOP;
-- Close the Context
DBMS_XMLGEN.CLOSECONTEXT(my_context);
--Exception Block
EXCEPTION
WHEN OTHERS THEN
NULL; -- Add your exception handler message here
END;
/
让我解释一下以上代码中使用的每个函数/过程: DBMS_XMLGEN.NEWCONTEXT
此函数用于创建一个返回CONTEXTID的NEW CONTEXT。 当使用DBMS_XMLGEN包的其他功能/过程时,将需要此CONTEXTID
DBMS_XMLGEN.SETROWSETTAG此过程用于设置XML数据的根元素。 在上面的示例中,我将ROOT ELEMENT设置为EMP_DETAILS。 您可以在下面发布的输出中检查ROOT ELEMENT,将其设置为EMP_DETAILS。 根元素可以设置为任何值,具体取决于它所保存的数据类型。
DBMS_XMLGEN.SETROWTAG此过程用于设置XML数据的行标记。 由于输出是员工详细信息,因此我将ROW TAG设置为EMP
DBMS_XMLGEN.GETXML此函数用于为我们创建的新上下文生成XML结构化输出。 创建新上下文时,我们传递了SELECT查询作为输入参数。 因此,使用此函数将使用我们使用SETROWSETTAG和SETROWTAG过程定义的相应ROW TAG和ROWSET TAG将SELECT查询的输出转换为XML格式数据,如上所示。
检查以下由上面发布的代码生成的示例输出:
My New Context ID is:44
<?xml version="1.0"?>
<EMP_DETAILS>
<EMP>
<EMPNO>7369</EMPNO>
<ENAME>SMITH</ENAME>
<JOB>CLERK</JOB>
<MGR>7902</MGR>
<HIREDATE>17-DEC-80</HIREDATE>
<SAL>800</SAL>
<DEPTNO>20</DEPTNO>
</
EMP>
<EMP>
<EMPNO>7499</EMPNO>
<ENAME>ALLEN</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>20-FEB-81</HIREDATE>
<SAL>1600</SAL>
<COMM>300</COMM>
<DEPTNO>30</DEPTNO>
</EMP>
<E
MP>
<EMPNO>7521</EMPNO>
<ENAME>WARD</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>22-FEB-81</HIREDATE>
<SAL>1250</SAL>
<COMM>500</COMM>
<DEPTNO>30</DEPTNO>
</EMP>
<EMP>
<EM
PNO>7566</EMPNO>
<ENAME>JONES</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>02-APR-81</HIREDATE>
<SAL>2975</SAL>
<DEPTNO>20</DEPTNO>
</EMP>
<EMP>
<EMPNO>7654</EMPNO>
<ENAME>MA
RTIN</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>28-SEP-81</HIREDATE>
<SAL>1250</SAL>
<COMM>1400</COMM>
<DEPTNO>30</DEPTNO>
</EMP>
<EMP>
<EMPNO>7698</EMPNO>
<ENAME>BLAKE</E
NAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>01-MAY-81</HIREDATE>
<SAL>2850</SAL>
<DEPTNO>30</DEPTNO>
</EMP>
<EMP>
<EMPNO>7782</EMPNO>
<ENAME>CLARK</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>09-JUN-81</HIREDATE>
<SAL>2450</SAL>
<DEPTNO>10</DEPTNO>
</EMP>
<EMP>
<EMPNO>7788</EMPNO>
<ENAME>SCOTT</ENAME>
<JOB>ANALYST</JOB>
<MGR>7566</MGR>
<HIREDATE
>09-DEC-82</HIREDATE>
<SAL>3000</SAL>
<DEPTNO>20</DEPTNO>
</EMP>
<EMP>
<EMPNO>7839</EMPNO>
<ENAME>KING</ENAME>
<JOB>PRESIDENT</JOB>
<HIREDATE>17-NOV-81</HIREDATE>
<SAL>5000</SAL>
<DE
PTNO>10</DEPTNO>
</EMP>
<EMP>
<EMPNO>7844</EMPNO>
<ENAME>TURNER</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>08-SEP-81</HIREDATE>
<SAL>1500</SAL>
<COMM>0</COMM>
<DEPTNO>30</
DEPTNO>
</EMP>
<EMP>
<EMPNO>7876</EMPNO>
<ENAME>ADAMS</ENAME>
<JOB>CLERK</JOB>
<MGR>7788</MGR>
<HIREDATE>12-JAN-83</HIREDATE>
<SAL>1100</SAL>
<DEPTNO>20</DEPTNO>
</EMP>
<EMP>
<EMPN
O>7900</EMPNO>
<ENAME>JAMES</ENAME>
<JOB>CLERK</JOB>
<MGR>7698</MGR>
<HIREDATE>03-DEC-81</HIREDATE>
<SAL>950</SAL>
<DEPTNO>30</DEPTNO>
</EMP>
<EMP>
<EMPNO>7902</EMPNO>
<ENAME>FORD</E
NAME>
<JOB>ANALYST</JOB>
<MGR>7566</MGR>
<HIREDATE>03-DEC-81</HIREDATE>
<SAL>3000</SAL>
<DEPTNO>20</DEPTNO>
</EMP>
<EMP>
<EMPNO>7934</EMPNO>
<ENAME>MILLER</ENAME>
<JOB>CLERK</JOB>
<MGR>7782</MGR>
<HIREDATE>23-JAN-82</HIREDATE>
<SAL>1300</SAL>
<DEPTNO>10</DEPTNO>
</EMP>
</EMP_DETAILS>
From: https://bytes.com/topic/oracle/insights/879145-data-fetch-xml-structure-using-dbms_xmlgen