3

2つの列を持つテーブルがありますxml_documents。1つの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から値を抽出するコミットマテリアライズドビューで高速リフレッシュを作成するにはどうすればよいですか?

4

1 に答える 1

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が正常に機能しているときにXMLTypeが機能しないのは奇妙に思えます。これに関するドキュメントが見つかりません。それがバグなのか、実装されていない機能なのか、それともそれを機能させる魔法の設定があるのか​​はわかりません。他の誰もより良い答えを提供できない場合は、上記のアプローチを使用する前に、Oracleサポートに確認する価値があるかもしれません。

于 2011-04-08T06:04:35.150 に答える