Oracle: как создать материализованное представление быстрого обновления, извлекающее данные из XMLType? - PullRequest
3 голосов
/ 08 апреля 2011

У меня есть таблица xml_documents с двумя столбцами: столбец document_id (первичный ключ) и столбец xml с некоторыми данными XML, что является схемой XMLType.Я могу создать материализованное представление только с помощью document_id с помощью:

create materialized view mv refresh fast on commit as 
select document_id
from xml_documents

Это прекрасно работает, но не очень полезно.Как и следовало ожидать, я бы хотел, чтобы материализованное представление извлекало данные из XML, и для этого я использую extractValue().Я пытаюсь следующее:

create materialized view mv refresh fast on commit as 
select document_id, extractValue(xml, '/my/gaga') gaga
from xml_documents

Это не с:

ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view

Как мне создать быстрое обновление для материализованного представления фиксации, извлекающего значения из XML?

1 Ответ

2 голосов
/ 08 апреля 2011

Ваш XMLType (вероятно) хранится как CLOB. Найдите скрытый столбец с запросом, подобным следующему:

select * from user_tab_cols where table_name = 'XML_DOCUMENTS';

Затем создайте функцию для преобразования CLOB в XMLType и извлеките значение. Обратите внимание, что ключевое слово «детерминированное» необходимо, хотя Я не уверен почему. Передача данных назад и вперед между SQL и PL / SQL будет медленной, но если вы используете материализованное представление, то, вероятно, уже медленно.

create or replace function extract_from_clob(p_xml in clob) return varchar2 deterministic
  is
begin
    return XMLType(p_xml).extract('/my/gaga/text()').getStringVal();
end;
/

Затем перетащите и создайте материализованное представление с системным столбцом, переданным в функцию:

create materialized view mv refresh fast on commit as 
select document_id, extract_from_clob(SYS_NC00003$) gaga
from xml_documents;

Я не уверен в использовании сгенерированного системой скрытого столбца. Это работает, но не кажется хорошей идеей. По крайней мере, это будет сделано Трудно создать объект в разных системах - вам нужно будет каждый раз находить новое имя столбца.

Кажется странным, что XMLTypes не работают, когда большие объекты работают нормально. Я не могу найти документацию по этому поводу; Я не уверен, является ли это ошибкой, нереализованной функцией, или есть какая-то волшебная настройка, которая заставит это работать. Если никто не может дать лучший ответ, возможно, стоит обратиться в службу поддержки Oracle, прежде чем использовать вышеуказанный подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...