ORA-000932将xmltype连接到varchar字段时

时间:2015-02-09 14:45:14

标签: oracle tsql join oracle11g xmltype

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

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以上......

1 个答案:

答案 0 :(得分:0)

(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,如下所示。

在内联视图的子句中将旧式交叉连接与逗号混合似乎有点奇怪,其余部分使用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;