使用DBMS_XMLGEN以XML结构获取数据

本文介绍了如何在Oracle数据库中使用DBMS_XMLGEN包将SELECT查询的结果转换为XML格式。通过设置根元素和行标签,可以方便地生成结构化的XML数据,这对于实时应用中的数据交换非常有用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在实时应用程序中,始终需要以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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值