我连接到Oracle数据库(11g版本2-11.2.0.4),具有只读访问权限。
在这个数据库中,一些数据是通过或者更确切地说是通过XML上传的,而且相当多的条目包含多个以&#nnnn;格式出现的XML (特殊)字符实体。
到目前为止,我已经在一个Excel脚本中处理了这些&#nnnn;,以将它们转换为Unicode字符,但我宁愿在我正在运行的将数据导出(到Excel)的script中这样做。
这个问答几乎涵盖了同样的问题,但我还不能成功地复制或实现我的案例中的答案,因此需要帮助。
问答中被接受的答案包含我假定的SQL命令(错误地?)我不能使用(使用只读访问),例如create table、insert into、declare和loop.
另一个答案为我工作,因为我可以复制它(不是在一个在线小提琴(如何?)但是在Oracle中,尽管有两个缺陷: 1)它不循环,因此只有当字段只包含一个特殊的&#nnnn;字符(一次或多次),而不包含不同的&#nnnn;字符时,它才能工作;2)由于某种原因,它无法与 (非中断空间)一起工作。
基于以上所引用的问答,如何在Oracle11g中使用只读访问将这些XML (特殊)字符转换为Unicode?
相关链接(S):
(失败)迄今的尝试:
select regexp_replace(s, '&#([0-9]+);', u) from
(select s, unistr('\0' || REPLACE(TO_CHAR(TO_NUMBER(c), 'xxxx'), ' ', '')) u from
(select s, regexp_replace(s, '.*&#([0-9]+);.*', '\1') c from
(select 'Hallöle slovenĈina Hallöle slovenđina' s from dual)))霍尔·斯莱文đina Hall le slovenđina
Ĉ (=Ĉ)实际上被đ (=đ)“覆盖”。也就是说,这个脚本只适用于只包含一个和同一个特殊字符的字段;它将用一个字符覆盖所有其他特殊字符(这显然是不可取的)。
select regexp_replace(s, '&#([0-9]+);', u) from
(select s, unistr('\0' || REPLACE(TO_CHAR(TO_NUMBER(c), 'xxxx'), ' ', '')) u from
(select s, regexp_replace(s, '.*&#([0-9]+);.*', '\1') c from
(select 'Hallöle sloven ina' s from dual)))ORA- 30186:'\‘必须后面跟着四个十六进制字符或另一个'\’30186。00000 - "'\‘’必须后面跟着四个十六进制字符或另一个'\‘’*原因:在SQL函数联阿安全or的参数中,'\‘必须后面跟着四个六进制字符或另一个’\‘*操作:修正字符串格式
由于某些原因,非破缺空间( )的行为似乎与这里的其他特殊字符不同;也许这是Oracle的例外?
select REGEXP_REPLACE(specialCharData,'&#([0-9]+);',unistr('\' || replace(to_char(to_number(regexp_replace(specialCharData, '.*?&#([0-9]+);.*输出3(错误消息)ORA-01722: invalid number
01722. 00000 - "invalid number"
*Cause: The specified number was invalid.
*Action: Specify a valid number.评论3specialCharData将是我数据库中字段/列的名称。SQL 4select REGEXP_REPLACE(specialCharData,'&#([0-9]+);',unistr('\' || replace(regexp_replace(specialCharData, '.*?&#([0-9]+);.*输出4(错误消息)ORA- 30186:'\‘必须后面跟着四个十六进制字符或另一个'\’30186。00000 - "'\‘’必须后面跟着四个十六进制字符或另一个'\‘’*原因:在SQL函数联阿安全or的参数中,'\‘必须后面跟着四个六进制字符或另一个’\‘*操作:修正字符串格式评论4specialCharData将是我数据库中字段/列的名称。在这里,我试图通过删除to_char(to_number(部分来修剪SQL 3。没那么有用,也许..。随机测试想法..。, '\1')), 'xxx'), ' ', '0')),1,1) as "bla", ................K145输出3(错误消息)K246A47K148评论3K249D50将是我数据库中字段/列的名称。K151SQL 4K252A53K154输出4(错误消息)K255J156ORA- 30186:'\‘必须后面跟着四个十六进制字符或另一个'\’30186。00000 - "'\‘’必须后面跟着四个十六进制字符或另一个'\‘’*原因:在SQL函数联阿安全or的参数中,'\‘必须后面跟着四个六进制字符或另一个’\‘*操作:修正字符串格式J257K158评论4K259D60将是我数据库中字段/列的名称。在这里,我试图通过删除D61部分来修剪SQL 3。没那么有用,也许..。随机测试想法..。, '\1'), ' ', '0')),1,1) as "specialChar", ................K154输出4(错误消息)K255J156
ORA- 30186:'\‘必须后面跟着四个十六进制字符或另一个'\’30186。00000 - "'\‘’必须后面跟着四个十六进制字符或另一个'\‘’*原因:在SQL函数联阿安全or的参数中,'\‘必须后面跟着四个六进制字符或另一个’\‘*操作:修正字符串格式
J257K158评论4K259
D60将是我数据库中字段/列的名称。在这里,我试图通过删除D61部分来修剪SQL 3。没那么有用,也许..。随机测试想法..。
, '\1')), 'xxx'), ' ', '0')),1,1) as "bla", ................K145输出3(错误消息)K246A47K148评论3K249
D50将是我数据库中字段/列的名称。
K151SQL 4K252A53K154输出4(错误消息)K255J156
ORA- 30186:'\‘必须后面跟着四个十六进制字符或另一个'\’30186。00000 - "'\‘’必须后面跟着四个十六进制字符或另一个'\‘’*原因:在SQL函数联阿安全or的参数中,'\‘必须后面跟着四个六进制字符或另一个’\‘*操作:修正字符串格式
J257K158评论4K259
D60将是我数据库中字段/列的名称。在这里,我试图通过删除D61部分来修剪SQL 3。没那么有用,也许..。随机测试想法..。
发布于 2020-05-26 14:25:29
数据看起来像是没有XML标记的原始XML数据,而不是翻译的文本。你应该先把它修好。
同时,您可以通过XMLTable()运行数据来为您进行转换。
with data as (
select 'Hallöle slovenĈina Hallöle slovenđina' str from dual
)
select a.str, b.str2
from data a, xmltable( '/'
passing xmltype( '' || a.str || '' )
columns
str2 varchar2(4000) path '/dat'
) b产生预期的结果:

https://dba.stackexchange.com/questions/267868
复制相似问题