将Oracle Row序列化为XML

时间:2018-03-23 00:59:37

标签: xml database oracle stored-procedures plsql

我正在构建一个记录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?

3 个答案:

答案 0 :(得分:0)

您可以使用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>

如需进一步阅读,请参阅this

答案 1 :(得分:0)

在源表上创建一个包含准备好的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 LOG ERRORS INTO errlog('my_bad');

这将记录teh异常表中的所有行列,您可以在此表的视图中显示XML。

答案 2 :(得分:0)

无法将行发送到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 '.');