我正在构建一个记录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?
答案 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 '.');