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

前端之家收集整理的这篇文章主要介绍了sql – “ORA-22812:在尝试访问系统表时无法引用嵌套表列的存储表”前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的Oracle 12c数据库中有一个表

XML Schema创建:

  1. BEGIN
  2. -- Register the schema
  3. DBMS_XMLSCHEMA.registerSchema('http://www.example.com/fvInteger_12.xsd','<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  4. <xs:element name="FeatureVector">
  5. <xs:complexType>
  6. <xs:sequence>
  7. <xs:element name="feature" type="xs:integer" minOccurs="12" maxOccurs="12"/>
  8. </xs:sequence>
  9. </xs:complexType>
  10. </xs:element>
  11. </xs:schema>',TRUE,FALSE);
  12. END;
  13. /

创建表:

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

表DDL:

  1. SELECT
  2. DBMS_MetaDATA.GET_DDL( 'TABLE','FV_XML_12_1000')
  3. FROM DUAL;

上面的查询结果:

  1. CREATE TABLE "HIGIIA"."FV_XML_12_1000"
  2. ( "ID" NUMBER,"FV" "SYS"."XMLTYPE"
  3. ) SEGMENT CREATION IMMEDIATE
  4. PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
  5. NOCOMPRESS LOGGING
  6. STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  7. PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  8. BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  9. TABLESPACE "USERS"
  10. VARRAY "FV"."XMLDATA"."feature" STORE AS TABLE "SYS_NTZqNkxcSIThTgU5pCWr3HmA=="
  11.  
  12. (( PRIMARY KEY ("NESTED_TABLE_ID","SYS_NC_ARRAY_INDEX$")
  13. USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
  14. STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  15. PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  16. BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  17. TABLESPACE "USERS" ENABLE)
  18. PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 LOGGING
  19. STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  20. PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  21. BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  22. TABLESPACE "USERS" ) RETURN AS LOCATOR
  23. XMLTYPE COLUMN "FV" XMLSCHEMA "http://www.example.com/fvInteger_12.xsd" ELEMEN
  24. T "FeatureVector" ID 4129

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

  1. SYS_NTZqNkxcSIThTgU5pCWr3HmA==

但是,我无法执行命令:

  1. desc SYS_NTZqNkxcSIThTgU5pCWr3HmA==

因为我收到错误

SP2-0565: Identificador invalido.

查询

  1. select * from "SYS_NTZqNkxcSIThTgU5pCWr3HmA=="

返回错误

ORA-22812: cannot reference nested table column’s storage table

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

提前致谢!

解决方法

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

但是,您可以通过取消该表来;请注意,您必须包含一个表别名,并使用它来使点表示法正确解析;并且必须引用“功能”,因为它区分大小写:

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

您无法看到整个fv或其隐式XMLDATA,只能看到varray中保存的特征值.

如果我创建三个虚拟行:

  1. insert into fv_xml_12_1000 values (1,xmltype.createxml ('<?xml version="1.0"?>
  2. <FeatureVector xmlns:ns="http://www.example.com/fvInteger_12.xsd">
  3. <feature>123</feature>
  4. </FeatureVector>'));
  5.  
  6. insert into fv_xml_12_1000 values (2,xmltype.createxml ('<?xml version="1.0"?>
  7. <FeatureVector xmlns:ns="http://www.example.com/fvInteger_12.xsd">
  8. <feature>234</feature>
  9. </FeatureVector>'));
  10.  
  11. insert into fv_xml_12_1000 values (3,xmltype.createxml ('<?xml version="1.0"?>
  12. <FeatureVector xmlns:ns="http://www.example.com/fvInteger_12.xsd">
  13. <feature>456</feature>
  14. <feature>567</feature>
  15. </FeatureVector>'));

那个查询给了我:

  1. ID Result Sequence
  2. ---------- ---------------
  3. 1 123
  4. 2 234
  5. 3 456
  6. 3 567

您也可以使用普通的XML DB机制访问XML文档;将存储的数据看作XML文档只需:

  1. select fv from fv_xml_12_1000;

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

如果要从XML文档中提取元素,可以使用XQuery或XMLTable;这相当于上一个查询

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

…但是你可以添加一个更有用的XPath表达式和/或columns子句来获得你想要的数据,例如:

  1. select f.id,x.feature
  2. from fv_xml_12_1000 f
  3. cross join xmltable(
  4. '/FeatureVector/feature'
  5. passing f.fv
  6. columns feature number path '.')
  7. x;

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

  1. ID FEATURE
  2. ---------- ----------
  3. 1 123
  4. 2 234
  5. 3 456
  6. 3 567

猜你在找的MsSQL相关文章