从XmlElement函数中删除无效的XML字符

时间:2017-03-15 15:07:42

标签: oracle

我有一个表(称为SMARTDATA),它通过将长音符分成512个字符行来存储长音符:

ID    NOT NULL NUMBER(18)    
LINE  NOT NULL NUMBER(38) 
TEXT           VARCHAR2(512)

工作流允许用户将HTML文本粘贴到应用程序的控件中,最终填充SMARTDATA表。

出于报告目的,这些注释被序列化为一行:

SELECT  id, 
        RTRIM(XMLAGG(XMLELEMENT(E,text,'').EXTRACT('//text()') ORDER BY LINE).GetClobVal(),',') NOTES
FROM    smartdata
GROUP BY id

不幸的是,输入的某些字符(例如CANCEL; U+0018)导致XmlElement()函数生成错误:ORA-64451: Conversion of special character to escaped character failed.

虽然我当然可以用零长度字符串替换单个字符,但这是一个脆弱的解决方案:

SELECT  id,
        RTRIM(XMLAGG(XMLELEMENT(E,  replace(text,UNISTR('\0018'), ''), '').EXTRACT('//text()') ORDER BY LINE).GetClobVal(),',') NOTES
FROM    smartdata
GROUP BY id

是否有更有效的方法从text字段中删除有问题的字符,而不必单独列出?

**编辑**

测试数据:

WITH 

data as ( select 'A           A' text from dual )
SELECT dump(text, 1010) FROM dual

Typ=96 Len=14 CharacterSet=WE8ISO8859P1: 65,32,32,32,24,32,32,32,32,32,32,160,32,65

ISO/IEC 8859-1似乎不存在代码点24,因此错误。

0 个答案:

没有答案