2011-04-07 27 views
3

我有一個表xml_documents與兩列:document_id列(主鍵)和xml列與一些XML數據,這是一個無模式XMLType。我可以創建一個物化視圖只用document_id有:Oracle:如何創建一個從XMLType中提取數據的快速刷新物化視圖?

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 

我應該如何去創造ON COMMIT物化視圖,從XML提取值的快速刷新?

回答

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支持進行檢查。

+0

哇,謝謝你這個驚人的答案。我認爲我們正在接近,但是當我運行'create materialized view ...'時,我得到一個'SQL錯誤:ORA-30625:NULL SELF參數的方法調度被禁止',我不知道如何解決它。你有什麼主意嗎? (原始表中的'xml'列被定義爲'xmltype not null',但這可能是不相關的。) – avernet 2011-04-09 06:05:53

+0

您是如何創建表和物化視圖日誌的?下面是我使用的命令: 'create table xml_documents(document_id number primary key,xml xmltype not null);'''用主鍵創建物化視圖日誌xml_documents;'。這在10.2.0.1.0和11.2.0.1.0中適用於我。 – 2011-04-09 16:36:59

+0

感謝您的跟進。我終於發現問題所在:'/ my/gaga'在一些行中不存在。所以我想'extract()'返回'null',因此應用'getStringVal()'導致錯誤,Oracle不允許我創建物化視圖。爲了解決這個問題,我修改了'extract_from_clob()'來測試以避免這個問題。我還添加了XPath表達式作爲參數,這使得它可以按原樣使用。 – avernet 2011-04-12 18:26:43

相關問題