首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Oracle中将xml实体转换为unicode字符(具有只读访问权限)?

如何在Oracle中将xml实体转换为unicode字符(具有只读访问权限)?
EN

Database Administration用户
提问于 2020-05-25 20:24:50
回答 1查看 1.2K关注 0票数 3

我连接到Oracle数据库(11g版本2-11.2.0.4),具有只读访问权限。

在这个数据库中,一些数据是通过或者更确切地说是通过XML上传的,而且相当多的条目包含多个以&#nnnn;格式出现的XML (特殊)字符实体。

到目前为止,我已经在一个Excel脚本中处理了这些&#nnnn;,以将它们转换为Unicode字符,但我宁愿在我正在运行的将数据导出(到Excel)的script中这样做。

这个问答几乎涵盖了同样的问题,但我还不能成功地复制或实现我的案例中的答案,因此需要帮助。

问答中被接受的答案包含我假定的SQL命令(错误地?)我不能使用(使用只读访问),例如create tableinsert intodeclareloop.

另一个答案为我工作,因为我可以复制它(不是在一个在线小提琴(如何?)但是在Oracle中,尽管有两个缺陷: 1)它不循环,因此只有当字段只包含一个特殊的&#nnnn;字符(一次或多次),而不包含不同的&#nnnn;字符时,它才能工作;2)由于某种原因,它无法与 (非中断空间)一起工作。

基于以上所引用的问答,如何在Oracle11g中使用只读访问将这些XML (特殊)字符转换为Unicode?

相关链接(S):

(失败)迄今的尝试:

SQL 1

代码语言:javascript
复制
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)))

输出1

霍尔·斯莱文đina Hall le slovenđina

评论1

Ĉ (=Ĉ)实际上被đ (=đ)“覆盖”。也就是说,这个脚本只适用于只包含一个和同一个特殊字符的字段;它将用一个字符覆盖所有其他特殊字符(这显然是不可取的)。

SQL 2

代码语言:javascript
复制
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)))

输出2(错误消息)

ORA- 30186:'\‘必须后面跟着四个十六进制字符或另一个'\’30186。00000 - "'\‘’必须后面跟着四个十六进制字符或另一个'\‘’*原因:在SQL函数联阿安全or的参数中,'\‘必须后面跟着四个六进制字符或另一个’\‘*操作:修正字符串格式

评论2

由于某些原因,非破缺空间( )的行为似乎与这里的其他特殊字符不同;也许这是Oracle的例外?

SQL 3

代码语言:javascript
复制
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。没那么有用,也许..。随机测试想法..。

EN

回答 1

Database Administration用户

回答已采纳

发布于 2020-05-26 14:25:29

数据看起来像是没有XML标记的原始XML数据,而不是翻译的文本。你应该先把它修好。

同时,您可以通过XMLTable()运行数据来为您进行转换。

代码语言:javascript
复制
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

产生预期的结果:

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/267868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档