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

Oracle ORA-000932将xmltype连接到varchar字段时,oracle,tsql,join,oracle11g,xmltype,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(

有一点背景知识,我在数据库中有一个逗号分隔的列,我试图将其转换为多对多连接表,因此

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…..

返回的是XMLType,而不是varchar2。可以在内联视图中将其强制转换为所需的类型:

cast(EXTRACT(column_value,'/e/text()') as varchar2(3))
或者在比较值时:

a11.CODE = cast(a12.HQCAT as varchar2(3))
我已经猜到了您需要的可变大小,显然,您可能需要不同的大小。您还可以按如下所示使用

在内联视图的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;