"ORA-22812: cannot reference nested table column's storage table" 尝试访问系统时 table
"ORA-22812: cannot reference nested table column's storage table" when trying to access system table
我的 Oracle 12c 数据库中有一个 table
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;
/
创建了 table:
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";
table 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
我想访问这个 table,它在 HIGIIA 架构中(它确实在 higiia 的 user_tables 中)。 :
SYS_NTZqNkxcSIThTgU5pCWr3HmA==
但是,我无法执行命令:
desc SYS_NTZqNkxcSIThTgU5pCWr3HmA==
因为我收到错误:
SP2-0565: Identificador invalido.
查询:
select * from "SYS_NTZqNkxcSIThTgU5pCWr3HmA=="
Return错误:
ORA-22812: cannot reference nested table column's storage table
我应该怎么做才能访问此 table (table SYS_NTZqNkxcSIThTgU5pCWr3HmA==)?
提前致谢!
尽管 FV 列是嵌套的 table,但不能像 table 那样访问它。所有访问必须通过 table FV_XML_12_1000.
SELECT *
FROM TABLE( SELECT FV
FROM FV_XML_12_1000);
您正在将 XML 文档存储为 'object relational',这导致 Oracle 为存储创建一个内部 table,您通常不需要直接访问它。
你 可以 但是,通过取消嵌套 table;请注意,您必须包含一个 table 别名,并使用它来正确解析点符号; "feature"
必须被引用,因为它是 case-sensitive:
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 数据库机制访问 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 表达式 and/or 列子句来获取您想要的相关数据,例如:
select f.id, x.feature
from fv_xml_12_1000 f
cross join xmltable(
'/FeatureVector/feature'
passing f.fv
columns feature number path '.')
x;
它为您提供主 table ID 值和所有相关的特征编号,每个 ID/feature 占一行。使用与以前相同的三个虚拟行,该查询为我提供:
ID FEATURE
---------- ----------
1 123
2 234
3 456
3 567
我的 Oracle 12c 数据库中有一个 table
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;
/
创建了 table:
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";
table 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
我想访问这个 table,它在 HIGIIA 架构中(它确实在 higiia 的 user_tables 中)。 :
SYS_NTZqNkxcSIThTgU5pCWr3HmA==
但是,我无法执行命令:
desc SYS_NTZqNkxcSIThTgU5pCWr3HmA==
因为我收到错误:
SP2-0565: Identificador invalido.
查询:
select * from "SYS_NTZqNkxcSIThTgU5pCWr3HmA=="
Return错误:
ORA-22812: cannot reference nested table column's storage table
我应该怎么做才能访问此 table (table SYS_NTZqNkxcSIThTgU5pCWr3HmA==)?
提前致谢!
尽管 FV 列是嵌套的 table,但不能像 table 那样访问它。所有访问必须通过 table FV_XML_12_1000.
SELECT *
FROM TABLE( SELECT FV
FROM FV_XML_12_1000);
您正在将 XML 文档存储为 'object relational',这导致 Oracle 为存储创建一个内部 table,您通常不需要直接访问它。
你 可以 但是,通过取消嵌套 table;请注意,您必须包含一个 table 别名,并使用它来正确解析点符号; "feature"
必须被引用,因为它是 case-sensitive:
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 数据库机制访问 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 表达式 and/or 列子句来获取您想要的相关数据,例如:
select f.id, x.feature
from fv_xml_12_1000 f
cross join xmltable(
'/FeatureVector/feature'
passing f.fv
columns feature number path '.')
x;
它为您提供主 table ID 值和所有相关的特征编号,每个 ID/feature 占一行。使用与以前相同的三个虚拟行,该查询为我提供:
ID FEATURE
---------- ----------
1 123
2 234
3 456
3 567