代码之家  ›  专栏  ›  技术社区  ›  Siqueira

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

  •  7
  • Siqueira  · 技术社区  · 6 年前

    我的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\u表 确实如此。):

    SYS_NTZqNkxcSIThTgU5pCWr3HmA==
    

    但是,我无法执行命令:

    desc SYS_NTZqNkxcSIThTgU5pCWr3HmA==
    

    因为我得到了错误:

    SP2-0565:确认无效。

    查询:

    select * from "SYS_NTZqNkxcSIThTgU5pCWr3HmA=="
    

    返回错误:

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

    我应该如何访问此表(表SYS\u NTZqNkxcSIThTgU5pCWr3HmA==)?

    提前感谢!

    2 回复  |  直到 6 年前
        1
  •  6
  •   ArtBajji    6 年前

    虽然列FV是一个嵌套表,但它不能像表一样访问。所有访问必须通过FV\u XML\u 12\u 1000表进行。

    SELECT *
      FROM TABLE( SELECT FV
                    FROM FV_XML_12_1000);
    
        2
  •  4
  •   Alex Poole    6 年前

    您将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 ,只是 feature varray中保存的值。

    如果创建三个虚拟行:

    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表达式和/或columns子句,以获取相关数据,例如:

    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