首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转义字符用于Oracle的Xmltable

转义字符用于Oracle的Xmltable
EN

Stack Overflow用户
提问于 2019-03-28 15:18:35
回答 1查看 1.4K关注 0票数 0

我使用Xmltable将逗号分隔的电子邮件地址字段转换为值表。

代码语言:javascript
复制
WITH

data AS
  (
    select  1 ID, 'foo&bar@domain.tld,bar@domain.tld' recipients from dual
  )

select  ID, trim(COLUMN_VALUE) recipient
from    data,xmltable(('"'|| REPLACE( recipients , ',', '","') || '"'))

产生一个错误:

72000 ORA-19112:在计算过程中引发的错误: XVM-01003:“foo”1 "foo&bar@domain.tld“、"bar@domain.tld”-^

但是,当我将&替换为其实体值(&)时:

代码语言:javascript
复制
WITH

DATA AS
  (
    select  1 ID, 'foo&bar@domain.tld,bar@domain.tld' recipients from dual
  )

select  ID
        -- & --> &
        , replace( trim(COLUMN_VALUE), '&', '&') recipient
from    data
        -- & --> &
        ,xmltable(('"'|| REPLACE( replace( recipients, '&','&')  , ',', '","') || '"'))

查询工作如下:

代码语言:javascript
复制
ID,RECIPIENT
1,foo&bar@domain.tld
1,bar@domain.tld

我想象可能有其他字符在一个电子邮件地址中是有效的,但对Xmltable来说是有问题的。

有更好的方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-28 15:51:31

你可以用 function

代码语言:javascript
复制
with data (id, recipients) as
(
  select 1, 'foo&bar@domain.tld,bar@domain.tld' from dual
)
select d.id, dbms_xmlgen.convert(x.column_value.getstringval(), 1) as recipient
from data d
cross join
xmltable(('"' || replace(dbms_xmlgen.convert(d.recipients, 0), ',', '","') || '"')) x

        ID RECIPIENT                     
---------- ------------------------------
         1 foo&bar@domain.tld            
         1 bar@domain.tld                

内部调用dbms_xmlgen.convert(d.recipients, 0)给您

代码语言:javascript
复制
foo&bar@domain.tld,bar@domain.tld

在将其修改为在每个逗号分隔的值周围有双引号并被拆分为多个行之后,您将以column_value作为结束:

代码语言:javascript
复制
foo&bar@domain.tld
bar@domain.tld

因此,外部dbms_xmlgen.convert(x.column_value.getstringval(), 1)将任何编码实体转换回它们的普通版本。

如果在PL/SQL上下文中这样做,那么可以使用dbms_xmlgen.entity_encodedbms_xmlgen.entity_decode来代替固定的0和1,但它们在普通SQL中是不可用的。

(无论如何,only five entities是要担心的,但您最好还是允许它们全部使用--不管它们在电子邮件地址中是否有效--使用这样的函数调用可能不会让未来的维护人员感到困惑.)

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

https://stackoverflow.com/questions/55401185

复制
相关文章

相似问题

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