我有一个包含两列的表xml_documents
:document_id
列(主键)和带有一些XML数据的xml
列,这是一个无模式{{1} }。我可以使用XMLType
创建一个物化视图:
document_id
这很好用,但不是很有用。正如您所料,我希望物化视图从XML中提取数据,为此我使用create materialized view mv refresh fast on commit as
select document_id
from xml_documents
。我正在尝试以下方法:
extractValue()
这失败了:
create materialized view mv refresh fast on commit as
select document_id, extractValue(xml, '/my/gaga') gaga
from xml_documents
我应如何在提交物化视图上创建快速刷新,从XML中提取值?
答案 0 :(得分:2)
您的XMLType(可能)存储为CLOB。使用如下查询查找隐藏列:
select * from user_tab_cols where table_name = 'XML_DOCUMENTS';
然后创建一个函数将CLOB转换为XMLType,并提取值。请注意,“deterministic”关键字是必要的 我不知道为什么。在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;
我不确定使用系统生成的隐藏列。它有效,但似乎不是一个好主意。它至少会成功 很难在不同的系统上创建对象 - 您每次都需要找到新的列名。
当LOB工作正常时,XMLTypes不起作用似乎很奇怪。我找不到任何关于此的文件;我不确定这是一个错误,一个未实现的功能,或者是否有一些神奇的设置可以使它工作。如果没有其他人能够提供更好的答案,那么在使用上述方法之前,可能需要使用Oracle支持进行检查。