以 XML 形式获取任何 SQL 游标的结果集,并以列名作为属性,而无需在 Oracle 中使用 XSLT

问题描述 投票:0回答:1

我正在尝试创建一个例程,它采用“任意光标”作为输入,并以这种形式生成 XML 形式的结果集: <ROWSET> <ROW> <COLUMN name="ID">1</COLUMN> <COLUMN name="NAME">Linda</COLUMN> <COLUMN name="AGE">63</COLUMN> </ROW> <ROW> <COLUMN name="ID">2</COLUMN> <COLUMN name="NAME">Richard</COLUMN> <COLUMN name="AGE">36</COLUMN> </ROW> </ROWSET>

到目前为止,我发现 DBMS_XMLGEN 是更接近我的用例的工具,但我看不到如何将列名作为属性获取。请注意,在我的用例中,XSLT 不是一个选项,因为数据集可能很大,并且 XSLT 在这种情况下效率不高。

oracle oracle-xml-db
1个回答
0
投票
DBMS_XMLGEN

生成 XML,然后

XMLTABLE
和 Oracle 的 XML 函数将其转换为不同的结构:
DECLARE
  ctx  NUMBER;
  xml  CLOB;
BEGIN
  ctx := DBMS_XMLGEN.NEWCONTEXT('SELECT * FROM table_name'); 
  xml := DBMS_XMLGEN.GETXML(ctx);  
  DBMS_XMLGEN.CLOSECONTEXT(ctx);
  FOR r IN (
    SELECT XMLSERIALIZE(
             DOCUMENT
             XMLELEMENT(
               "ROWSET",
               XMLAGG(
                 XMLELEMENT(
                   "ROW",
                   XMLAGG(
                     XMLELEMENT("COLUMN", XMLATTRIBUTES(name AS "name"), value)
                   )
                 )
               )
             ) AS CLOB
             INDENT SIZE=2
           ) AS xml
    FROM   XMLTABLE(
             '/ROWSET/ROW'
             PASSING XMLTYPE(xml)
             COLUMNS
               id FOR ORDINALITY,
               rw XMLTYPE PATH '.'
           ) r
           CROSS APPLY XMLTABLE(
             '/ROW/*'
             PASSING r.rw
             COLUMNS
               name VARCHAR2(30) PATH './name()',
               value VARCHAR2(4000) PATH '.'
           )
    GROUP BY r.id
  ) LOOP
    DBMS_OUTPUT.PUT_LINE(r.xml);
  END LOOP;
END;
/

对于样本数据:

CREATE TABLE table_name (id, name, age) AS SELECT 1, 'Linda', 63 FROM DUAL UNION ALL SELECT 2, 'Richard', 36 FROM DUAL

输出:

<ROWSET> <ROW> <COLUMN name="ID">1</COLUMN> <COLUMN name="AGE">63</COLUMN> <COLUMN name="NAME">Linda</COLUMN> </ROW> <ROW> <COLUMN name="ID">2</COLUMN> <COLUMN name="AGE">36</COLUMN> <COLUMN name="NAME">Richard</COLUMN> </ROW> </ROWSET>

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.