我有一个表(称为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,因此错误。