在 XML 字段上执行 pl/sql GROUP BY 会给出“ORA-22806: not an object or REF”

Posted

技术标签:

【中文标题】在 XML 字段上执行 pl/sql GROUP BY 会给出“ORA-22806: not an object or REF”【英文标题】:Doing a pl/sql GROUP BY on an XML field gives "ORA-22806: not an object or REF" 【发布时间】:2009-08-27 10:51:24 【问题描述】:

这是示例 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。

【问题讨论】:

【参考方案1】:

我看到同样的错误:

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

【讨论】:

【参考方案2】:
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

【讨论】:

9.2.0.8i 使用 SQLDeveloper 1.5.4 连接 哦。无法方便地检查 9i,抱歉。【参考方案3】:

以下内容在 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()'))
 ;

【讨论】:

我正在对 9.2.0.8.0 数据库运行 TOAD。你能确认你的数据库版本吗?我无法想象这会有所作为,但也可以通过 SQLPlus 尝试

以上是关于在 XML 字段上执行 pl/sql GROUP BY 会给出“ORA-22806: not an object or REF”的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQL 或 PL/SQL 解析 XML 文档以提取字段值

在 pl/sql 上创建大 xml

如何执行已经存在的 PL/SQL。 (甲骨文 APEX 21.1)

PL/SQL 组函数的替代方案

从 PL/SQL 开发人员处读取 XML 文件

不要在游标 PL/SQL 中显示重复值