在 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 文档以提取字段值