我正在尝试创建一个例程,它采用“任意光标”作为输入,并以这种形式生成 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 在这种情况下效率不高。
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>