在XML字段上执行pl / sql GROUP BY会产生“ORA-22806:不是对象或REF”

时间:2009-08-27 10:51:24

标签: xml oracle plsql

以下是示例SQL:

SELECT xml_data.field
FROM
  (SELECT sys.XMLType(source_table.data).extract('//source_node/text()') AS field
  FROM source_table
  )xml_data
GROUP BY to_clob(xml_data.field)

仅当我使用GROUP BY进行计数时才会出现错误。当它被删除时我得到错误

ORA-22806: not an object or REF
22806. 00000 - "not an object or REF"
*Cause: An attempt was made to extract an attribute from an
        item that is neither an object nor a REF.
*Action: Use an object type or REF type item and retry the operation.
Vendor code 22804Error at Line:1

GROUP BY是否以某种方式改变了子查询中返回的XML字段的类型?或者(很可能)我只是错过了什么?

值得注意的是source_table.data列是CLOB。

3 个答案:

答案 0 :(得分:2)

我看到同样的错误:

SQL> select * from v$version;

BANNER
-------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
PL/SQL Release 9.2.0.1.0 - Production
CORE    9.2.0.1.0       Production
TNS for 32-bit Windows: Version 9.2.0.1.0 - Production
NLSRTL Version 9.2.0.1.0 - Production

我在select语句中重新排列了函数调用,这会导致错误消失。

create table source_table (data clob);
insert into source_table values ('<source_node>test</source_node>');
commit;

select xmltype.getstringval((field).extract('//source_node/text()'))
from
(
  select  xmltype(data) field
  from    source_table
)
group by xmltype.getstringval((field).extract('//source_node/text()'))
/

您必须使用((field).extract ...而不是(field.extract...

答案 1 :(得分:1)

SELECT  field
FROM    (
        SELECT  SYS.XMLType.getstringval(SYS.XMLType('<source_node>test</source_node>').extract('//source_node/text()')) AS field
        FROM    dual
        ) xml_data
GROUP BY
        field

答案 2 :(得分:0)

以下在9.2中为我工作

SELECT  SYS.XMLType.getstringval(SYS.XMLType('<source_node>test</source_node>').extract('//source_node/text()')) AS field
FROM    dual      
group by SYS.XMLType.getstringval(SYS.XMLType('<source_node>test</source_node>').extract('//source_node/text()'))
 ;