替换xmlelement中的控件字符

时间:2014-08-13 19:26:12

标签: regex oracle plsql

上下文

为生成XML而创建的一些PL / SQL包会抛出此错误:

ORA-31061: Erreur XDB : special char to escaped char conversion failed.

发生此错误是因为xmlelement中选择的某些文本包含不允许的控制字符。

解决方案

用正则表达式替换每个xmlelement的所有控件字符:

xmlelement("foo", REGEXP_REPLACE (bar, '[[:cntrl:]]', ''))

解决方案问题

我有8个大约5k行的包,每行几乎都是xmlelement。

其他潜在解决方案

我认为我可以编写一个正则表达式来自动替换每个xmlelement的值,但是当我在xmlelement中使用子查询和子子查询等xmlelement时它会失败。

我的问题

是否有更聪明的方法然后逐个替换每个xmlelement的值?我被要求做每个包的所有xmlelement以防止进一步的错误,但我确信有更好的方法来做到这一点。

修改

例如,您可以使用此查询重现错误:

select xmlelement("foo", unistr('\0013b')) from dual;

我会使用此查询修复它:

select xmlelement("foo", regexp_replace(unistr('\0013b'), '[[:cntrl:]]', '')) from dual;

1 个答案:

答案 0 :(得分:2)

我认为这不是您想要的,但是可以使用dbms_xmlgen为您的查询生成xml而不会出错。这是一个例子:

declare
    xml_output CLOB;
    my_context dbms_xmlgen.ctxHandle;
begin
    my_context := dbms_xmlgen.newcontext('select unistr (''\0013b'') from dual');
    xml_output := dbms_xmlgen.getxml(my_context);
    dbms_xmlgen.closecontext(my_context);
    dbms_output.put_line(xml_output);
end;