【问题标题】:Oracle: how to create a fast refresh materialized view that extracts data from XMLType?Oracle:如何创建从 XMLType 中提取数据的快速刷新物化视图?
【发布时间】:2011-04-07 21:48:03
【问题描述】:

我有一个表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 中提取值?

【问题讨论】:

    标签: oracle materialized-views xmltype extract-value


    【解决方案1】:

    您的 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 支持人员咨询。

    【讨论】:

    • 哇,感谢您的精彩回答。我想我们已经接近了,但是当我运行create materialized view… 时,我得到一个SQL Error: ORA-30625: method dispatch on NULL SELF argument is disallowed,我不知道如何绕过它。你有什么主意吗? (原表中的xml 列定义为xmltype not null,但这可能不相关。)
    • 您究竟是如何创建表和物化视图日志的?以下是我使用的命令:create table xml_documents(document_id number primary key, xml xmltype not null);create materialized view log on xml_documents with primary key;。这在 10.2.0.1.0 和 11.2.0.1.0 上对我有用。
    • 感谢您的跟进。我终于找到了问题所在:某些行不存在/my/gaga。所以我想extract() 正在返回null,因此应用getStringVal() 会导致错误,并且Oracle 没有让我创建物化视图。为了解决这个问题,我修改了你的extract_from_clob() 来测试避免这个问题。我还添加了 XPath 表达式作为参数,使其可以按原样使用。
    猜你喜欢
    • 2013-06-28
    • 2013-12-04
    • 1970-01-01
    • 2015-06-13
    • 2018-09-04
    • 2013-05-31
    • 2021-11-06
    • 2021-11-18
    • 2011-10-20
    相关资源
    最近更新 更多