Jea*_*ard 5 regex oracle plsql
语境
一些为生成 XML 而创建的 PL/SQL 包抛出此错误:
ORA-31061: Erreur XDB : special char to escaped char conversion failed.
Run Code Online (Sandbox Code Playgroud)
发生此错误的原因是 xml 元素中选择的某些文本包含不允许的控制字符。
解决方案
将每个 xmlelement 的所有控制字符替换为正则表达式:
xmlelement("foo", REGEXP_REPLACE (bar, '[[:cntrl:]]', ''))
Run Code Online (Sandbox Code Playgroud)
问题与解决方案
我有 8 个包,每个包大约 5k 行,其中几乎每一行都是一个 xml 元素。
其他潜在的解决方案
我以为我可以编写一个正则表达式来自动替换每个 xmlelement 的值,但是当我在 xmlelement 中包含带有子查询和子子查询等的 xmlelement 时,它会失败。
我的问题
有没有一种更聪明的方法然后逐一替换每个 xmlelement 的值?我被要求执行每个包的所有 xmlelement 以防止进一步的错误,但我确信有更好的方法来做到这一点。
编辑
例如,您可以使用以下查询重现该错误:
select xmlelement("foo", unistr('\0013b')) from dual;
Run Code Online (Sandbox Code Playgroud)
我将使用以下查询修复它:
select xmlelement("foo", regexp_replace(unistr('\0013b'), '[[:cntrl:]]', '')) from dual;
Run Code Online (Sandbox Code Playgroud)
我不认为这正是您想要的,但可以使用 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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4238 次 |
| 最近记录: |