Oracle:如何创建从XMLType中提取数据的快速刷新物化视图?

时间:2011-04-07 21:48:04

标签: oracle materialized-views xmltype extract-value

我有一个包含两列的表xml_documentsdocument_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中提取值?

1 个答案:

答案 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支持进行检查。