将 Oracle 行序列化为 XML
Posted
技术标签:
【中文标题】将 Oracle 行序列化为 XML【英文标题】:Serializing Oracle Row into XML 【发布时间】:2018-03-23 00:59:37 【问题描述】:我正在构建一个记录 SQL INSERT 错误的表,所以当一行违反唯一约束,或者有太多值或任何事情很愚蠢时,我们希望将其记录到表中。我想创建一个 XML 列并将问题行序列化为 XML,但我想知道是否有一种方法可以在不指定列名的情况下将 rw(游标变量)序列化为 XML。
DECLARE
CURSOR TABLE1
IS
SELECT * FROM (SELECT * FROM TABLENAME) WHERE ROWNUM < 500;
BEGIN
FOR rw IN TABLE1
LOOP
/*SELECT DBMS_XMLGEN.GETXML('SELECT rw FROM DUAL') doesn't work*/
END LOOP;
EXCEPTION WHEN OTHERS THEN
END;
我最接近的是不得不重新选择它。
SELECT DBMS_XMLGEN.GETXML('SELECT * FROM (SELECT * FROM TABLENAME) WHERE ID = ' || rw.id) FROM DUAL
但我不需要重新查询,因为我已经有了它,对吗?有没有办法将 rw 发送到 XML?
【问题讨论】:
【参考方案1】:您可以使用 SYS_XMLGEN Oracle SQL 函数。
create table mytab(n number, v varchar2(5));
insert into mytab values(1,'abc');
insert into mytab values(2,'def');
insert into mytab values(3,'ghi');
commit;
SELECT sys_XMLGen(n) AS "SerialNumber",
sys_XMLGen(v) AS "Text"
FROM mytab;
输出:
SerialNumber Text
<N>1</N> <V>abc</V>
<N>2</N> <V>def</V>
<N>3</N> <V>ghi</V>
如需进一步阅读,请参阅OracleDocumentation。
【讨论】:
这没有回答问题。 rw 是游标内的一行如何将 sys_xmlgen 应用于游标变量? 你需要一个光标。为什么不直接执行 SQL? 正如我在原始问题中解释的那样。我将行一一插入到表中,如果存在异常(违反唯一约束、值过多等),我希望能够分析创建异常的记录。我不能只是查询,因为我不知道插入是否会爆炸,除非我尝试一下【参考方案2】:在源表上创建一个视图,其中包含准备好的用于记录的 XML 列。
create view v_mytab as
select n, v,
XMLELEMENT("row",
XMLFOREST(
n AS "n",
v AS "v"
)
) as xml_col
from mytab;
select * from v_mytab;
N V XML_COL
---------- ----- ------------------------------
1 abc <row><n>1</n><v>abc</v></row>
2 def <row><n>2</n><v>def</v></row>
3 ghi <row><n>3</n><v>ghi</v></row>
在处理游标时使用XML_COL
以防出现异常。
如果您关心性能,请注意您也可以在 INSERT
语句中使用 execption loggin。
插入到 trgt (n,v) 从 v_mytab 中选择 n,v 将错误记录到 errlog ('my_bad');
这将记录异常表中的所有行列,您可以在该表的视图中显示 XML。
【讨论】:
【参考方案3】:没有办法将行发送到 xml。您只能尝试使用动态光标。
select xmlserialize(document serialized) from xmltable('ROWSET/ROW' passing xmltype(
cursor(select * from user_objects where rownum<10 /* your query */)
) columns serialized xmltype path '.');
【讨论】:
以上是关于将 Oracle 行序列化为 XML的主要内容,如果未能解决你的问题,请参考以下文章
将 Xml 反序列化为对象时出错 - xmlns='' 不是预期的