将 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的主要内容,如果未能解决你的问题,请参考以下文章

将 Python 字典序列化为 XML [关闭]

将 XML 序列化为对象

我可以将匿名类型序列化为 xml 吗?

将 Xml 反序列化为对象时出错 - xmlns='' 不是预期的

将 Xml 反序列化为对象时出错 - xmlns='' 不是预期的

将 Class 对象序列化为平面 XML