"ORA-22812: невозможно ссылаться на таблицу хранения столбца вложенной таблицы" при попытке доступа к системной таблице
у меня есть таблица в моей базе данных 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: Identificador invalido.
запрос:
select * from "SYS_NTZqNkxcSIThTgU5pCWr3HmA=="
возвращает ошибку:
ORA-22812: невозможно ссылаться на таблицу хранения столбца вложенной таблицы
что я должен сделать, чтобы получить доступ к этой таблице (Таблица SYS_NTZqNkxcSIThTgU5pCWr3HmA==)?
спасибо заранее!
2 ответов
вы храните 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-документам с помощью обычных механизмов XML DB; чтобы увидеть сохраненные данные как XML-документы, просто сделайте:
select fv from fv_xml_12_1000;
или добавить фильтр для выбора 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/feature. С теми же тремя фиктивными строками, что и раньше, этот запрос дает мне:
ID FEATURE
---------- ----------
1 123
2 234
3 456
3 567
хотя столбец FV является вложенной таблицей, к нему нельзя получить доступ как к таблице. Весь доступ должен быть через таблицу FV_XML_12_1000.
SELECT *
FROM TABLE( SELECT FV
FROM FV_XML_12_1000);