【问题标题】:Replace control char in xmlelement替换xmlelement中的控制字符
【发布时间】:2014-10-07 07:20:09
【问题描述】:

上下文

为生成 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;

【问题讨论】:

标签: regex oracle plsql


【解决方案1】:

我不认为这正是您想要的,但是可以使用 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;

【讨论】:

  • 你说得对,这不是我想要的,因为我的目标是避免重写 40​​k 行或自动写入。不过,感谢您的回答,因为我不知道 dbms_xmlgen 不会为控制字符抛出错误。
猜你喜欢
  • 2012-10-22
  • 1970-01-01
  • 2011-10-17
  • 2014-03-23
  • 1970-01-01
  • 2014-06-15
  • 1970-01-01
  • 2023-01-07
  • 2013-02-26
相关资源
最近更新 更多