暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 链接时缺少序列的XMLTable问题

askTom 2017-05-17
266

问题描述

你好,汤姆伙计们,

我有一个问题/误解xmlchaining如何在缺少标签和默认情况下工作。

数据库版本: 12.1.0.2.0

下面是我的问题的快速示例:

with dummy as (
  select xmltype(
  '
    
        A
        
          test1
          test2
        
    
    
        B
        
          
        
    
    
        C
    
'
  ) as data from dual
)
select t.name, p.phone
from dummy,
xmltable(
  'Employees/Employee' passing dummy.data
  columns
    name varchar2(20 char) path 'firstname'
    , phone xmltype path 'phones/phone'
) t,
xmltable(
  '/phone' passing t.phone
  columns
   phone varchar2(10 char) path 'value'
) p


通常情况下,我们希望员工在里面有 标签和N个 标签的序列,就像示例A一样。
在这种情况下,一切正常。

示例B-是我为了使xmlchining像left join,但可悲的是它的合成,如果数据丢失,在这种情况下,手机,我们有示例C。根本没有标签,所以sqlresult中也没有行,看起来像这样。

A test1
A test2
B 


我很好奇,如果缺少标签 ,我可以默认制作这样的系统数据。
根据文件https://docs.oracle.com/database/121/ADXDB/xdb_xquery.htm#ADXDB5097

The optional DEFAULT clause specifies the value to use when the PATH expression results in an empty sequence (or NULL). Its expr is an XQuery expression that is evaluated to produce the default value.


我以为我在寻找什么,并提出了更新版本:
with dummy as (
  select xmltype(
  '
    
        A
        
          test1
          test2
        
    
    
        B
        
    
    
        C
    
'
  ) as data from dual
)
select t.name, p.phone
from dummy,
xmltable(
  'Employees/Employee' passing dummy.data
  columns
    name varchar2(20 char) path 'firstname'
    , phone xmltype path 'phones/phone'
    default xmltype(
    '
          
        '
    )
) t,
xmltable(
  '/phone' passing t.phone
  columns
   phone varchar2(10 char) path 'value'
) p


但这给了我0行输出。它不应该给我我想要的结果吗?你能帮我吗?


专家解答

所以你想为每个客户的每个电话值一行吗?如果没有,则显示null的行?

无论如何,似乎有一个嵌套xmltable调用的错误。您可以通过将第一个调用放在另一个带有子句/子查询的内部来解决它。然后使用no_merge提示停止Oracle数据库组合它们:

with dummy as (
  select xmltype(
  '
    
        A
        
          test1
          test2
        
    
    
        B
        
    
    
        C
    
'
  ) as data from dual
), phones as (
select /*+ no_merge */*
from dummy,
xmltable(
  'Employees/Employee' passing dummy.data
  columns
    name varchar2(20 char) path 'firstname'
    , phone xmltype path 'phones/phone'
   default xmltype('')
) t
)
select t.phone, p.phone from phones t,
xmltable(
  '/phone' passing t.phone
  columns
   phone varchar2(100 char) path 'value'
) p;

PHONE   PHONE  
OPAQUE  test1  
OPAQUE  test2  
OPAQUE         
OPAQUE

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论