【问题标题】:ORA-000932 When joining an xmltype to a varchar fieldORA-000932 将 xmltype 加入 varchar 字段时
【发布时间】:2015-02-09 14:45:13
【问题描述】:

一点背景故事,我在数据库中有一个逗号分隔的列,我试图将其转换为多对多联结表,所以没有

ID REPORT
1   5,6,7

我会看到

ID REPORT
1    5
1    6
1    7

下面的查询就是这样做的,而且似乎工作正常,

 with t as (select id,hqcat from report)
SELECT id, EXTRACT(column_value,'/e/text()') hqcat from t x,
TABLE(XMLSEQUENCE(EXTRACT(XMLTYPE('<ROW><e>'||REPLACE(hqcat,',','</e><e>')||'</e></ROW>'),'//e')))

但是,当我尝试通过 hqcat 将其加入我的查找表时,我收到关于不稳定数据类型的 ORA-00932 错误,请帮助我,如何更改我的原始查询以使其与其他表和连接一起使用?

这是导致错误的连接:

select *
from    BIN03   a11
    join    (  with t as (select id,hqcat from report)
SELECT id, EXTRACT(column_value,'/e/text()') hqcat from t x,
TABLE(XMLSEQUENCE(EXTRACT(XMLTYPE('<ROW><e>'||REPLACE(hqcat,',','</e><e>')||'</e></ROW>'),'//e')))) a12
      on    (a11.CODE = a12.HQCAT);

谢谢!

我也尝试过这样创建新的“多对多”视图:

WITH TAB AS 
( (select id ID, hqcat STR from report))
SELECT ID as ID, 
REGEXP_SUBSTR (STR, '[^,]+', 1, LEVEL) HQCAT  FROM TAB 
CONNECT BY LEVEL <= (regexp_count(str,',') + 1);

但这只会将查询速度降低 1000 秒.....

【问题讨论】:

    标签: oracle tsql join oracle11g xmltype


    【解决方案1】:

    (deprecated) extract function 返回 XMLType,而不是 varchar2。您可以在内联视图中将其转换为您想要的类型:

    cast(EXTRACT(column_value,'/e/text()') as varchar2(3))
    

    或者比较值时:

    a11.CODE = cast(a12.HQCAT as varchar2(3))
    

    我已经猜到了您需要的可变大小,显然,您可能需要它不同。您也可以使用the XMLType getStringVal() function,如下所示。

    在内联视图的 from 子句中将老式交叉连接与逗号混合在一起,其余部分使用 ANSI 连接,这似乎有点奇怪,这样做可能会得到奇怪的(或难以调试的)结果。为了清楚起见,您还可以使用另一个 CTE:

    with t as (select id, hqcat from report),
    a12 as (
      select id, extract(column_value,'/e/text()').getstringval() hqcat
      from t
      cross join table(xmlsequence(extract(xmltype('<ROW><e>'||
        replace(hqcat,',','</e><e>')||'</e></ROW>'),'//e')))
    )
    select *
    from a12
    join bin03 a11 on a11.code = a12.hqcat;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-24
      • 1970-01-01
      • 1970-01-01
      • 2014-12-06
      • 2016-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多