3

我有一个xml_documents包含两列的表:一个document_id列(主键)和一个xml包含一些 XML 数据的列,这是一个无模式的XMLType. 我可以只用 with 创建一个物化视图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 中提取值的提交物化视图上创建快速刷新?

4

1 回答 1

2

您的 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;

我不确定是否使用系统生成的隐藏列。它有效,但似乎不是一个好主意。至少在不同的系统上创建对象会很困难——你每次都需要找到新的列名。

当 LOB 工作正常时 XMLTypes 不起作用似乎很奇怪。我找不到任何有关此的文档;我不确定这是否是一个错误,一个未实现的功能,或者是否有一些神奇的设置可以让它工作。如果没有其他人可以提供更好的答案,那么在您使用上述方法之前,可能值得向 Oracle 支持人员查询。

于 2011-04-08T06:04:35.150 回答