“ORA-22812: 尝试访问系统表时无法引用嵌套表列的存储表”

Posted

技术标签:

【中文标题】“ORA-22812: 尝试访问系统表时无法引用嵌套表列的存储表”【英文标题】:"ORA-22812: cannot reference nested table column's storage table" when trying to access system table 【发布时间】:2018-08-19 04:34:03 【问题描述】:

我的 Oracle 12c 数据库中有一个表

XML 模式创建:

BEGIN
-- Register the schema
DBMS_XMLSCHEMA.registerSchema('http://www.example.com/fvInteger_12.xsd',
'<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="FeatureVector">
<xs:complexType>
<xs:sequence>
<xs:element name="feature" type="xs:integer" minOccurs="12" maxOccurs="12"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>',
   TRUE, TRUE, FALSE);
END;
/

创建表:

CREATE TABLE fv_xml_12_1000 (
   id    NUMBER,
   fv  XMLTYPE)
   XMLTYPE fv STORE AS OBJECT RELATIONAL
      XMLSCHEMA "http://www.example.com/fvInteger_12.xsd"
      ELEMENT "FeatureVector";

表格 DDL:

SELECT 
DBMS_METADATA.GET_DDL( 'TABLE','FV_XML_12_1000') 
FROM DUAL;

上面查询的结果:

  CREATE TABLE "HIGIIA"."FV_XML_12_1000"
   (    "ID" NUMBER,
    "FV" "SYS"."XMLTYPE"
   ) SEGMENT CREATION IMMEDIATE
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"
 VARRAY "FV"."XMLDATA"."feature" STORE AS TABLE "SYS_NTZqNkxcSIThTgU5pCWr3HmA=="

 (( PRIMARY KEY ("NESTED_TABLE_ID", "SYS_NC_ARRAY_INDEX$")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"  ENABLE)
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" ) RETURN AS LOCATOR
  XMLTYPE COLUMN "FV" XMLSCHEMA "http://www.example.com/fvInteger_12.xsd" ELEMEN
T "FeatureVector" ID 4129

我想访问这个表,它在 HIGIIA 模式中(它确实在 higiia 的 user_tables 中)。 :

SYS_NTZqNkxcSIThTgU5pCWr3HmA==

但是,我无法执行命令:

desc SYS_NTZqNkxcSIThTgU5pCWr3HmA==

因为我得到了错误:

SP2-0565:标识符无效。

查询:

select * from "SYS_NTZqNkxcSIThTgU5pCWr3HmA=="

返回错误:

ORA-22812: 无法引用嵌套表列的存储表

我应该怎么做才能访问这个表(表 SYS_NTZqNkxcSIThTgU5pCWr3HmA==)?

提前致谢!

【问题讨论】:

【参考方案1】:

您将 XML 文档存储为“对象关系”,这导致 Oracle 为存储创建一个内部表,您通常不需要直接访问。

可以通过取消表格的嵌套;请注意,您必须包含一个表别名,并使用它来正确解析点符号;并且 "feature" 必须被引用,因为它区分大小写:

select f.id, t.column_value
from fv_xml_12_1000 f
cross join table(f.fv.xmldata."feature") t;

您看不到整个 fv 或其隐含的 XMLDATA,只能看到 varray 中保存的 feature 值。

如果我创建三个虚拟行:

insert into fv_xml_12_1000 values (1, xmltype.createxml ('<?xml version="1.0"?>
<FeatureVector xmlns:ns="http://www.example.com/fvInteger_12.xsd">
 <feature>123</feature>
</FeatureVector>'));

insert into fv_xml_12_1000 values (2, xmltype.createxml ('<?xml version="1.0"?>
<FeatureVector xmlns:ns="http://www.example.com/fvInteger_12.xsd">
 <feature>234</feature>
</FeatureVector>'));

insert into fv_xml_12_1000 values (3, xmltype.createxml ('<?xml version="1.0"?>
<FeatureVector xmlns:ns="http://www.example.com/fvInteger_12.xsd">
 <feature>456</feature>
 <feature>567</feature>
</FeatureVector>'));

然后那个查询给了我:

        ID Result Sequence
---------- ---------------
         1             123
         2             234
         3             456
         3             567

您也可以使用普通的 XML DB 机制访问 XML 文档;以 XML 文档的形式查看存储的数据:

select fv from fv_xml_12_1000;

或添加过滤器以选择单个 ID 的 XML 文档。

如果您想从 XML 文档中提取元素,您可以使用 XQuery 或 XMLTable;这相当于前面的查询:

select x.*
from fv_xml_12_1000 f
cross join xmltable('/' passing f.fv columns x xmltype path '.') x;

...但您可以添加更有用的 XPath 表达式和/或列子句来获取您想要的相关数据,例如:

select f.id, x.feature
from fv_xml_12_1000 f
cross join xmltable(
  '/FeatureVector/feature'
  passing f.fv
  columns feature number path '.')
x;

它为您提供主表 ID 值和所有相关的功能编号,每个 ID/功能一行。使用与以前相同的三个虚拟行,该查询给了我:

        ID    FEATURE
---------- ----------
         1        123
         2        234
         3        456
         3        567

【讨论】:

【参考方案2】:

虽然列 FV 是嵌套表,但不能像表一样访问它。所有访问都必须通过表 FV_XML_12_1000。

SELECT *
  FROM TABLE( SELECT FV
                FROM FV_XML_12_1000);

【讨论】:

它不起作用...我收到此错误:ORA-22905:cannot access rows from a non-nested table item 我编辑了问题 - 我添加了表格创建。这可能会有所帮助。 从您的帖子中执行了创建表。它给出了这个错误。 "ORA-31000: 资源 'example.com/fvInteger_12.xsd' 不是 XDB 模式文档" 您的原始表格似乎已更改。它不再有任何嵌套表,而是一个 XMLType。您无法使用 XMLType 获得标题中提到的错误。那是一个嵌套表错误。这个问题是针对嵌套表的。对于 XMLType,如果您遇到任何新错误,请将其作为新问题与该错误一起发布。请注意,由于 Register Schema 步骤中的错误,我仍然无法创建表。 ORA-01741:非法的零长度标识符 ORA-06512:在“XDB.DBMS_XMLSCHEMA_INT”,第 3 行 ORA-06512:在“XDB.DBMS_XMLSCHEMA”,第 14 行 ORA-06512:在第 3 行 问题完全正确...Oracle将XMLType列存储为嵌套表...问题是我想直接访问系统创建的嵌套表。

以上是关于“ORA-22812: 尝试访问系统表时无法引用嵌套表列的存储表”的主要内容,如果未能解决你的问题,请参考以下文章