我遇到了一个奇怪的问题,查询在表别名上绝对可以正常工作,但在没有表别名时就不能了。
因此,这应该工作:
select a.xml.extract('(//test/@id)[1]').getStringVal() from test_table a;
然而,这不起作用:
select xml.extract('(//test/@id)[1]').getStringVal() from test_table;
错误:
ORA-00904: "XML"."EXTRACT": invalid identifier
00904. 00000 - "%s: invalid identifier"
*Cause:
*Action:
Error at Line: 1 Column: 8
您可能会发现这无需使用别名即可工作
select test_table.xml.extract('(//test/@id)[1]').getStringVal() from test_table;
正如另一条评论所说,xml.extract是一个对象方法。这意味着它不是一个可从任何地方访问的函数,它只能在处理表对象的特定实例时访问。一个简单的解释是,定义 xml.extract 的代码包含在定义表的代码中的某个地方,所以没有表,没有 xml.extract。
正如错误消息所暗示的那样,当它被单独调用时,Oracle不知道xml.extract是什么。