この章では、問合せフィードバックの生成、ヒット数のカウントおよびストアド・クエリー式の生成に使用できるPL/SQLパッケージCTX_QUERY
について説明します。
CTX_QUERY
パッケージには、次のプロシージャおよびファンクションが含まれています。
名前 | 説明 |
---|---|
索引内のシード・ワードに関するワードを戻します。 |
|
問合せへのヒット数を戻します。 |
|
問合せ式の解析および拡張情報を生成します。 |
|
階層問合せフィードバック情報(上位語、下位語および関連語)を生成します。 |
|
指定したストアド・クエリー式をSQL表から削除します。 |
|
問合せを実行して、結果セットを生成します。 |
|
CONTAINS問合せのカーソルを明示的にクローズした後で、問合せテンプレートに<ctx_result_set_descriptor>要素がある場合に、結果セット・ドキュメントを保持します。 |
|
問合せを実行して、その結果をストアド・クエリー式表に格納します。 |
注意:
このパッケージを使用できるのは、索引タイプがCONTEXT
の場合のみです。このパッケージは、CTXCAT
の索引タイプをサポートしていません。
このプロシージャを使用すると、Oracle Textの索引内のワードをブラウズできます。シード・ワードを指定すると、BROWSE_WORDS
は索引内のそのシード・ワードに関するワード、および各ワードが含まれているドキュメントのおよその数を戻します。
この機能は、問合せの詳細化に有効です。次のワードを識別できます。
非選択的ワード(そのワードを含むドキュメント件数が少ないワード)
ドキュメント・セットの中でスペルが間違っているワード
構文1: 表への結果の格納
ctx_query.browse_words(
index_name IN VARCHAR2, seed IN VARCHAR2, restab IN VARCHAR2, browse_id IN NUMBER DEFAULT 0, numwords IN NUMBER DEFAULT 10, direction IN VARCHAR2 DEFAULT BROWSE_AROUND, part_name IN VARCHAR2 DEFAULT NULL
);
構文2: メモリーへの結果の格納
ctx_query.browse_words(
index_name IN VARCHAR2, seed IN VARCHAR2, resarr IN OUT BROWSE_TAB, numwords IN NUMBER DEFAULT 10, direction IN VARCHAR2 DEFAULT BROWSE_AROUND, part_name IN VARCHAR2 DEFAULT NULL
);
索引の名前を指定します。schema.name
で指定できます。ローカル索引である必要があります。
シード・ワードを指定します。このワードは、ブラウズ拡張の前にレクサー処理されます。ワードがトークン表に存在する必要はありません。seedは単一のワードである必要があります。複数のワードをシードとして使用すると、エラーになります。
結果表の名前を指定します。restabは、schema.name
として入力できます。このプロシージャのコール前に、表が存在している必要があります。また、表に対するINSERT
権限が必要です。この表は、次のスキーマを持つ必要があります。
列 | データ型 |
---|---|
browse_id |
number |
word |
varchar2(64) |
doc_count |
number |
restabの中にある行が、BROWSE_WORDS
がコールされる前に削除されることはありません。
結果配列の名前を指定します。resarr
はctx_query.browse_tab
型です。
type browse_rec is record ( word varchar2(64), doc_count number ); type browse_tab is table of browse_rec index by binary_integer;
0から232の間で数値識別子を指定します。このブラウズのために生成された行は、restab
の中のbrowse_id
列に値を持ちます。browse_id
を指定しない場合、デフォルトは0(ゼロ)です。
戻すワード数を指定します。
ブラウズの方向を指定します。次のいずれかを指定できます。
値 | 動作 |
---|---|
|
シード・ワードおよびシードの前のワードをアルファベット順にブラウズします。 |
|
シード・ワードおよびシードの前後のワードをアルファベット順にブラウズします。 |
|
シード・ワードおよびシードの後のワードをアルファベット順にブラウズします。 |
記号CTX_QUERY.BROWSE_BEFORE
、CTX_QUERY.BROWSE_AROUND
およびCTX_QUERY.BROWSE_AFTER
も、これらのリテラル値に対して定義されています。
ブラウズする索引パーティション名を指定します。
例
結果表でのワードのブラウズ
begin ctx_query.browse_words('myindex','dog','myres',numwords=>5,direction=>'AROUND'); end; select word, doc_count from myres order by word; WORD DOC_COUNT -------- ---------- CZAR 15 DARLING 5 DOC 73 DUNK 100 EAR 3
結果配列でのワードのブラウズ
set serveroutput on; declare resarr ctx_query.browse_tab; begin ctx_query.browse_words('myindex','dog',resarr,5,CTX_QUERY.BROWSE_AROUND); for i in 1..resarr.count loop dbms_output.put_line(resarr(i).word || ':' || resarr(i).doc_count); end loop; end;
指定した問合せへのヒット数を戻します。実測または予測モードでCOUNT_HITS
をコールできます。実測モードは問合せへの正確なヒット数を戻します。予測モードは上限の見積りを戻しますが、実測モードよりも高速に実行します。
構文
構文1
exec CTX_QUERY.COUNT_HITS( index_name IN VARCHAR2, text_query IN VARCHAR2, exact IN BOOLEAN DEFAULT TRUE, part_name IN VARCHAR2 DEFAULT NULL ) RETURN NUMBER;
構文2
exec CTX_QUERY.COUNT_HITS_CLOB_QUERY( index_name IN VARCHAR2, text_query IN CLOB, exact IN BOOLEAN DEFAULT TRUE, part_name IN VARCHAR2 DEFAULT NULL ) RETURN NUMBER;
索引の名前を指定します。
問合せを指定します。
実測カウントにはTRUE
を指定します。上限を見積るにはFALSE
を指定します。
FALSE
を指定することによって戻された数値はあまり正確ではありませんが、より高速に実行されます。FULL
索引が最後に最適化されてから行が更新または削除されている場合、FALSE
を指定すると高すぎる数値が返されることがあります。このような不適切なヒットは完全モードでの最適化によって削除され、FALSE
に設定されたEXACT
と、TRUE
に設定されたEXACT
の戻す数値が同一になります。
問い合せる索引パーティション名を指定します。
問合せ式に関する実行計画情報を生成するには、CTX_QUERY.EXPLAIN
を使用します。実行
計画では、テキスト問合せ式に対して解析ツリーがグラフィカル表示されます。この情報は結果表に格納されます。
このプロシージャは問合せを実行しません。かわりに、問合せの入力前に、その問合せの拡張および解析の方法をユーザーに知らせます。これは、特にSTEM、ワイルド・カード、シソーラス、FUZZY、SOUNDEXまたはABOUT問合せに有効です。解析ツリーには、次の情報も表示されます。
Oracle Textによる問合せの評価方法を理解しておくと、問合せの詳細化やデバッグを行うときに役立ちます。また、実行計画情報を使用してユーザーがより高度な問合せを作成できるように、アプリケーションを設計できます。
構文
構文1
exec CTX_QUERY.EXPLAIN(
index_name IN VARCHAR2, text_query IN VARCHAR2, explain_table IN VARCHAR2, sharelevel IN NUMBER DEFAULT 0, explain_id IN VARCHAR2 DEFAULT NULL, part_name IN VARCHAR2 DEFAULT NULL
);
構文2
exec CTX_QUERY.EXPLAIN_CLOB_QUERY( index_name IN VARCHAR2, text_query IN CLOB, explain_table IN VARCHAR2, sharelevel IN NUMBER DEFAULT 0, explain_id IN VARCHAR2 DEFAULT NULL, part_name IN VARCHAR2 DEFAULT NULL );
問い合せる索引名を指定します。
行を選択する基準として使用する問合せ式を指定します。
text_query
にワイルド・カード、FUZZYまたはSOUNDEX演算子が含まれている場合、このプロシージャは索引表を調べて拡張を判断します。
ワイルド・カード、FUZZY(?)およびSOUNDEX(!)式のフィードバックでは、通常の問合せで削除が遅延した場合、その理由を判断できません。
text_queryに対する解析ツリー表現の格納に使用する表の名前を指定します。EXPLAIN
からの結果を格納するには、表に対して少なくともINSERT
権限およびDELETE
権限が必要です。
関連項目:
EXPLAIN表の構造の詳細は、「Oracle Text結果表」の「EXPLAIN表」を参照してください。
explain_table
を複数のEXPLAIN
コールで共有するかどうかを指定します。排他使用には0(ゼロ)を、共有使用には1を指定します。デフォルトは0(排他使用)です。
0(ゼロ)を指定すると、システムは次のEXPLAIN
のコールの前に自動的に結果表を切り捨てます。
共有使用の1を指定すると、このプロシージャは結果表を切り捨てません。同じexplain_id
を持つ結果のみが更新されます。同じexplain_id
の結果が存在しない場合は、新しい結果が実行計画表に追加されます。
複数のEXPLAIN
コールが同じ共有EXPLAIN
表を使用する場合は、EXPLAIN
プロシージャが戻した実行計画結果を識別する名前を指定します。デフォルトはNULL
です。
問い合せる索引パーティション名を指定します。
例
たとえば、test_explain
という名前の実行計画表を作成するには、次のSQL文を使用します。
create table test_explain( explain_id varchar2(30), id number, parent_id number, operation varchar2(30), options varchar2(30), object_name varchar2(64), position number, cardinality number);
comp% OR ?smithなどの問合せ式の拡張を取得するには、次のようにCTX_QUERY.EXPLAIN
を使用します。
ctx_query.explain( index_name => 'newindex', text_query => 'comp% OR ?smith', explain_table => 'test_explain', sharelevel => 0, explain_id => 'Test');
実行計画表を読み込むには、次のように列を選択できます。
select explain_id, id, parent_id, operation, options, object_name, position from test_explain order by id;
次のように、出力はID順に並べられ、階層問合せをシミュレートします。
EXPLAIN_ID ID PARENT_ID OPERATION OPTIONS OBJECT_NAME POSITION ----------- ---- --------- ------------ ------- ----------- -------- Test 1 0 OR NULL NULL 1 Test 2 1 EQUIVALENCE NULL COMP% 1 Test 3 2 WORD NULL COMPTROLLER 1 Test 4 2 WORD NULL COMPUTER 2 Test 5 1 EQUIVALENCE (?) SMITH 2 Test 6 5 WORD NULL SMITH 1 Test 7 5 WORD NULL SMYTHE 2
制限事項
CTX_QUERY.EXPLAIN
では、問合せテンプレートの使用はサポートされていません。
リモート問合せでCTX_QUERY.EXPLAIN
は使用できません。
英語またはフランス語の場合、このプロシージャは、指定された問合せへの階層問合せフィードバック情報(上位語、下位語および関連語)を生成します。
上位語、下位語および関連語情報はナレッジ・ベースから取得されます。ただし、索引中にも存在するナレッジ・ベース語句のみが、問合せフィードバック情報として戻ります。これによって、HFEEDBACK
プロシージャから戻された語句が、現在索引付けされているドキュメント・セットよりヒットする可能性が高くなります。
階層問合せフィードバック情報は、他の問合せ語句をユーザーに提示する場合に有効です。
構文
構文1
exec CTX_QUERY.HFEEDBACK( index_name IN VARCHAR2, text_query IN VARCHAR2, feedback_table IN VARCHAR2, sharelevel IN NUMBER DEFAULT 0, feedback_id IN VARCHAR2 DEFAULT NULL, part_name IN VARCHAR2 DEFAULT NULL );
構文2
exec CTX_QUERY.HFEEDBACK_CLOB_QUERY( index_name IN VARCHAR2, text_query IN CLOB, feedback_table IN VARCHAR2, sharelevel IN NUMBER DEFAULT 0, feedback_id IN VARCHAR2 DEFAULT NULL, part_name IN VARCHAR2 DEFAULT NULL );
問い合せるテキスト列の索引の名前を指定します。
行を選択する基準として使用する問合せ式を指定します。
フィードバック語の格納に使用する表の名前を指定します。
関連項目:
HFEEDBACK表の構造の詳細は、「Oracle Text結果表」の「HFEEDBACK表」を参照してください。
feedback_table
を複数のHFEEDBACK
コールで共有するかどうかを指定します。排他使用には0(ゼロ)を、共有使用には1を指定します。デフォルトは0(排他使用)です。
0(ゼロ)を指定すると、システムは次のHFEEDBACK
のコールの前に自動的にフィードバック表を切り捨てます。
共有使用の1を指定すると、このプロシージャはフィードバック表を切り捨てません。同じfeedback_id
を持つ結果のみが更新されます。同じfeedback_idの結果が存在しない場合は、新しい結果がフィードバック表に追加されます。
複数のHFEEDBACK
コールが同じ共有フィードバック表を使用する場合は、HFEEDBACK
のコールによって戻されたフィードバック結果を識別する値を指定します。デフォルトはNULL
です。
問い合せる索引パーティション名を指定します。
例
CTX_QUERY.HFEEDBACK
で使用する結果表を次のように作成します。
CREATE TABLE restab ( feedback_id VARCHAR2(30), id NUMBER, parent_id NUMBER, operation VARCHAR2(30), options VARCHAR2(30), object_name VARCHAR2(80), position NUMBER, bt_feedback ctxsys.ctx_feedback_type, rt_feedback ctxsys.ctx_feedback_type, nt_feedback ctxsys.ctx_feedback_type, NESTED TABLE bt_feedback STORE AS res_bt, NESTED TABLE rt_feedback STORE AS res_rt, NESTED TABLE nt_feedback STORE AS res_nt ;
CTX_FEEDBACK_TYPE はCTXSYS
スキーマのシステム定義型です。
関連項目:
HFEEDBACK
表の構造の詳細は、「Oracle Text結果表」の「HFEEDBACK表」を参照してください。
CTX_QUERY.HFEEDBACKのコール
次のコードは、computer industryの問合せを持つHFEEDBACK
プロシージャをコールします。
BEGIN ctx_query.hfeedback (index_name => 'my_index', text_query => 'computer industry', feedback_table => 'restab', sharelevel => 0, feedback_id => 'query10' ); END;
結果表からの選択
次のコードは、結果表からフィードバック・データを取り出します。上位語、下位語および関連語フィードバックがNESTED TABLEから個別に取り出されます。
DECLARE i NUMBER; BEGIN FOR frec IN ( SELECT object_name, bt_feedback, rt_feedback, nt_feedback FROM restab WHERE feedback_id = 'query10' AND object_name IS NOT NULL ) LOOP dbms_output.put_line('Broader term feedback for ' || frec.object_name || ':'); i := frec.bt_feedback.FIRST; WHILE i IS NOT NULL LOOP dbms_output.put_line(frec.bt_feedback(i).text); i := frec.bt_feedback.NEXT(i); END LOOP; dbms_output.put_line('Related term feedback for ' || frec.object_name || ':'); i := frec.rt_feedback.FIRST; WHILE i IS NOT NULL LOOP dbms_output.put_line(frec.rt_feedback(i).text); i := frec.rt_feedback.NEXT(i); END LOOP; dbms_output.put_line('Narrower term feedback for ' || frec.object_name || ':'); i := frec.nt_feedback.FIRST; WHILE i IS NOT NULL LOOP dbms_output.put_line(frec.nt_feedback(i).text); i := frec.nt_feedback.NEXT(i); END LOOP; END LOOP; END;
サンプル出力
次の出力は、computer industryについて問い合せる前述の例に対するものです。
Broader term feedback for computer industry: hard sciences Related term feedback for computer industry: computer networking electronics knowledge library science mathematics optical technology robotics satellite technology semiconductors and superconductors symbolic logic telecommunications industry Narrower term feedback for computer industry: ABEND - abnormal end of task AT&T Starlans ATI Technologies, Incorporated ActivCard Actrade International Ltd. Alta Technology Amiga Format Amiga Library Services Amiga Shopper Amstrat Action Apple Computer, Incorporated ..
注意:
取得したHFEEDBACK
情報は、索引およびナレッジ・ベースの内容に依存するため、示したサンプルの内容とは異なる可能性があります。
制限事項
CTX_QUERY.HFEEDBACK
では、問合せテンプレートの使用はサポートされていません。
CTX_QUERY.REMOVE_SQE
プロシージャは、指定したストアド・クエリー式を削除します。
CTX_QUERY.REMOVE_SQE
を使用すると、セッション期間SQEと永続SQEの両方を削除できます。「STORE_SQE」を参照してください。
query_name
ネームスペースは永続SQEとセッション期間SQEの間で共有されるため、削除するSQEの期間を指定する必要はありません。
例
begin ctx_query.remove_sqe('dis1'); ctx_query.remove_sqe('dis2'); end; /
このプロシージャは、XML問合せを実行してXMLの結果セットを生成します。結果セット・インタフェースは、SQLで表すことが困難なデータ・ビューを戻します。
関連項目:
XML結果セット・インタフェースの使用方法については、『Oracle Textアプリケーション開発者ガイド』を参照してください
構文
CTX_QUERY.RESULT_SET ( index_name IN VARCHAR2, query IN VARCHAR2, result_set_descriptor IN CLOB, result_set IN OUT NOCOPY CLOB, part_name IN VARCHAR2 DEFAULT NULL );
問合せを実行する索引を指定します。
問合せ文字列を指定します。
XMLの結果セット記述子を指定します。結果セットに含む内容を示します。詳細は、「入力結果セット識別子」を参照してください。
出力結果セットを指定します。この変数にNULL
を入力すると、セッション中に一時LOBが割り当てられてユーザーに戻ります。ユーザーは、この一時LOBの割当て解除の責任があります。詳細は、「出力結果セットXML」を参照してください。
索引パーティション名を指定します。グローバル索引の場合、part_name
をNULL
にする必要があります。パーティション索引でpart_name
がNULL
ではない場合、指定されたパーティションにのみ、問合せが評価されます。パーティション索引でpart_name
がNULL
の場合、すべてのパーティションで問合せが評価されます。
入力結果セット記述子
結果セット記述子は、結果セットの計算対象を示すXMLメッセージです。結果セット記述子の要素とその出現順序は、出力結果セットの内容を指定する簡単なテンプレートとして使用できます。つまり、ヒットしたROWIDのリスト、カウント、トークン数などを指定します。要素の属性には、ROWIDリストのヒット数や予測カウントおよび実測カウントなど、特定の操作のパラメータおよびオプションを指定します。
結果セット記述子自体は、次のDTDに準拠したXMLです。
<!ELEMENT ctx_result_set_descriptor (hitlist?, group*, count?)> <!ELEMENT hitlist (rowid?, score?, sdata*)> <!ELEMENT group(count?)> <!ELEMENT count EMPTY> <!ELEMENT rowid EMPTY> <!ELEMENT score EMPTY> <!ELEMENT sdata EMPTY> <!ATTLIST group sdata CDATA #REQUIRED> <!ATTLIST hitlist start_num_hit integer #REQUIRED> <!ATTLIST hitlist end_num_hit integer #REQUIRED> <!ATTLIST hitlist order PCDATA #IMPLIED> <!ATTLIST count exact (TRUE|FALSE) "FALSE"> <!ATTLIST sdata name CDATA #REQUIRED>
結果セット記述子に有効なXML要素は、次のとおりです。
ctx_result_set_descriptor
これは、結果セット記述子のルート要素です。親要素と使用できる属性はありません。
有効な子要素は、次のとおりです。
0(ゼロ)個以上のhitlist
要素。
0(ゼロ)個以上のgroup
要素。
1つのcount
要素。
group
group
要素は、生成された結果セットをグループに分類します。つまり、SDATA
セクションの値を使用して、結果を分類します。親要素はctx_result_set_descriptor
です。使用できる属性は、次のとおりです。
sdata
グループ化に使用するSDATA
セクションの名前を指定します。これは必須です。
group
の有効な子要素は、次のとおりです。
1つのcount
要素。
hitlist
hitlist
要素は、ヒットしたドキュメントのリストの包含を制御します。親要素はctx_result_set_descriptor
です。使用できる属性は、次のとおりです。
order
で使用できる子要素は、次のとおりです。
start_hit_num
生成された結果セットに含める最初にヒットしたドキュメントを指定します。16000以下の正の整数を設定できます。たとえば、start_hit_num
が21の場合、21番目にヒットしたドキュメントから結果セットにヒットしたドキュメントが格納されます。この要素は必須です。
end_hit_num
生成された結果セットに含める最後にヒットしたドキュメントを指定します。16000以下の正の整数を設定できます。たとえば、end_hit_num
が40の場合、40番目にヒットしたドキュメントまで結果セットにヒットしたドキュメントが格納されます。この要素は必須です。
hitlist
で使用できる子要素は、次のとおりです。
1つのrowid
要素。
1つのscore
要素。
1つのsdata
要素。
1つのsnippet
要素。
order
生成された結果セットにドキュメントの順序を指定するオプション属性です。値は、SQL ORDER
BY
文と類似するリストです。ただし、列名のかわりにSCORE
またはSDATA
セクション名を使用できます。次の例では、MYDATE
とMYPRICE
がSDATA
セクション名です。
(order = "SCORE DESC, MYDATE, MYPRICE DESC")
1つのrowid
要素。
1つのscore
要素。
1つのsdata
要素。
count
生成された結果セットにヒットしたドキュメントの数を格納します。親要素は、次のとおりです。
ctx_result_set_descriptor
group
count
で使用できる属性は、次のとおりです。
exact
予測モードに使用します。true
またはfalse
に設定します。これは必須です。デフォルトは、false
です。
count
の有効な子要素はありません。
rowid
生成された結果セットにヒットごとのROWID情報を格納します。親要素は、hitlist
です。属性および有効な子要素はありません。
score
生成された結果セットにヒットごとのスコア情報を格納します。
親要素は、hitlist
です。
使用できる属性および有効な子要素はありません。
sdata
生成された結果セットにヒットごとのsdata
値を格納します。
親要素は、hitlist
です。
使用できる属性はname
です。sdata
セクションの名前を指定します。これは必須です。
子要素はありません。
出力結果セットXML
出力結果セットXMLは、次のDTDに準拠したXMLです。
<!ELEMENT ctx_result_set (hitlist?, groups*, count?)> <!ELEMENT hitlist (hit*)> <!ELEMENT hit(rowid?, score?, sdata*)> <!ELEMENT groups (group*)> <!ELEMENT group (count?)> <!ELEMENT count CDATA> <!ELEMENT rowid CDATA> <!ELEMENT score CDATA> <!ELEMENT sdata CDATA> <!ATTLIST groups sdata CDATA #REQUIRED> <!ATTLIST group value CDATA #REQUIRED> <!ATTLIST sdata name CDATA #REQUIRED>
出力結果セットに有効なXML要素のリストは、次のとおりです。
ctx_result_set
生成された結果セットのルート要素です。属性はありません。親要素はありません。有効な子要素は、次のとおりです。
1つのhitlist
要素。
0(ゼロ)個以上のgroups
要素。
groups
グループ分類セクションの開始を区切ります。親要素は、ctx_result_set
です。使用できる属性は、次のとおりです。
sdata
グループ化に使用するsdata
セクションの名前です。
有効な子要素は、次のとおりです。
0(ゼロ)個以上のgroup
要素。
group
GROUP
BY
の値の開始を区切ります。親要素は、groups
要素です。使用できる属性は、次のとおりです。
value
sdata
セクションの値です。
有効な子要素は、1つのcount
要素です。
hitlist
hitlist
情報の開始を区切ります。親要素はctx_result_set
です。子は0個以上のhit
要素です。属性はありません。
hit
hitlist
内の特定のドキュメントの情報の開始を区切ります。親要素はhitlist
です。使用できる属性はありません。有効な子要素は、次のとおりです。
0(ゼロ)個または1個のrowid
要素。
0(ゼロ)個または1個のscore
要素。
0(ゼロ)個または1個のsdata
要素。
ゼロまたは1つのsnippet
要素。
rowid
ドキュメントのROWIDです。ドキュメントのROWIDが格納されます。親要素は、hit
要素です。子要素および使用できる属性はありません。
score
ドキュメントのスコアです。親要素は、hit要素です。数値のスコアが格納されます。使用できる属性および有効な子要素はありません。
sdata
ドキュメントのSDATA
の値です。親要素は、hit
要素です。使用できる属性は、sdata
セクション名のname
です。有効な子要素はありません。SDATA
セクション値が格納されます。DATE
の値は「YYYY-MM-DD HH24:MI:SS」形式で、格納される実際の値によって異なります。
count
ドキュメントのヒット数です。親要素は、ctx_result_set
要素またはgroup
要素です。数値のヒット数が格納されます。属性および有効な子要素はありません。
例
XMLのresult_set_descriptor
を指定したCTX_QUERY.RESULT_SET
のこのコールは、XML形式で次の情報を生成します。
pubDate SDATA
セクション値のDESC
およびスコアのDESC
で順序付けられた、スコア、ROWID、author SDATA
セクション値、およびpubDate SDATA
セクション値を表示する上位20個のヒット
テキスト問合せのドキュメントの総ヒット数
pubDate SDATA
セクション値でグループ化した数
author SDATA
セクション値でグループ化した数
declare rs clob; begin dbms_lob.createtemporary(rs, true, dbms_lob.session); ctx_query.result_set('docidx', 'oracle', ' <ctx_result_set_descriptor> <count/> <hitlist start_hit_num="1" end_hit_num="5" order="pubDate desc, score desc"> <score/> <rowid/> <sdata name="author"/> <sdata name="pubDate"/> </hitlist> <group sdata="pubDate"> <count/> </group> <group sdata="author"> <count/> </group> </ctx_result_set_descriptor> ', rs); dbms_lob.freetemporary(rs); exception when others then dbms_lob.freetemporary(rs); raise; end; /
結果セットの出力CLOBのXML出力ストアは、次のようになります。
<ctx_result_set> <hitlist> <hit> <score>3</score><rowid>AAAPoEAABAAAMWsAAC</rowid> <sdata name="AUTHOR">John</sdata> <sdata name="PUBDATE">2001-01-03 00:00:00</sdata> </hit> <hit> <score>3</score><rowid>AAAPoEAABAAAMWsAAG</rowid> <sdata name="AUTHOR">John</sdata> <sdata name="PUBDATE">2001-01-03 00:00:00</sdata> </hit> <hit> <score>3</score><rowid>AAAPoEAABAAAMWsAAK</rowid> <sdata name="AUTHOR">John</sdata> <sdata name="PUBDATE">2001-01-03 00:00:00</sdata> </hit> <hit> <score>3</score><rowid>AAAPoEAABAAAMWsAAO</rowid> <sdata name="AUTHOR">John</sdata> <sdata name="PUBDATE">2001-01-03 00:00:00</sdata> </hit> <hit> <score>3</score><rowid>AAAPoEAABAAAMWsAAS</rowid> <sdata name="AUTHOR">John</sdata> <sdata name="PUBDATE">2001-01-03 00:00:00</sdata> </hit> </hitlist> <count>100</count> <groups sdata="PUBDATE"> <group value="2001-01-01 00:00:00"><count>25</count></group> <group value="2001-01-02 00:00:00"><count>50</count></group> <group value="2001-01-03 00:00:00"><count>25</count></group> </groups> <groups sdata="AUTHOR"> <group value="John"><count>50</count></group> <group value="Mike"><count>25</count></group> <group value="Steve"><count>25</count></group> </groups> </ctx_result_set>
制約と制限事項
RESULT_SET
には、次の制約と制限事項が適用されます。
結果セット・インタフェース(RSI)は仮想プライベート・データベースではサポートされません。(VPDは通常のCONTAINS
問合せでサポートされますがRSIではサポートされません。)
ファンクションを実行するには、元表を問い合せることができる必要があります。
元表でVPDポリシーが有効な場合、結果セットのドキュメント位置に資格のないドキュメントは表示されません。
VPDポリシーを使用している場合、カウントなどの集計メソッドが正確でないことがあります。
関連項目
XML結果セット・インタフェースの詳細は、『Oracle Textアプリケーション開発者ガイド』を参照してください。
CONTAINS
問合せのカーソルを明示的にクローズした後で、問合せテンプレートに<ctx_result_set_descriptor>要素がある場合に、RESULT_SET_DOCUMENT
は結果セット・ドキュメントを保持します。
構文
CTX_QUERY.RESULT_SET_DOCUMENT( index_name IN VARCHAR2, query IN VARCHAR2, result_set_descriptor IN CLOB, result_set IN OUT NOCOPY CLOB, part_name IN VARCHAR2 DEFAULT NULL );
問合せを実行する索引を指定します。
問合せ文字列を指定します。
XMLの結果セット記述子を指定します。結果セットに含む内容を示します。詳細は、「入力結果セット識別子」を参照してください。
出力結果セットを指定します。この変数にNULL
を入力すると、セッション中に一時LOBが割り当てられてユーザーに戻ります。ユーザーは、この一時LOBの割当て解除の責任があります。詳細は、「出力結果セットXML」を参照してください。
索引パーティション名を指定します。グローバル索引の場合、part_name
をNULL
にする必要があります。パーティション索引でpart_name
がNULL
ではない場合、指定されたパーティションにのみ、問合せが評価されます。パーティション索引でpart_name
がNULL
の場合、すべてのパーティションで問合せが評価されます。
このプロシージャは、ストアド・クエリーまたはセッション期間問合せの式(SQE)を作成します。問合せ定義のみが格納されます。
SQEは、結果を格納せずに問合せの定義を格納するときに使用します。CONTAINS
のSQL演算子によって、その問合せの定義を参照します。このように、SQEを使用すると、長い問合せ式や使用頻度の高い問合せ式を簡単に定義できます。セッション期間SQEを作成すると、不要または使用しないSQEを削除するメンテナンス・オーバーヘッドを回避する場合に便利です。
サポートされている演算子
ストアド・クエリー式は、すべてのCONTAINS
問合せ演算子をサポートしています。また、すべての特殊文字、および他のストアド・クエリー式も含めて、問合せ式で使用できるすべてのコンポーネントをサポートしています。
権限
ユーザーは、所有しているストアド・クエリー式を作成および削除できます。ユーザーは、誰が所有するストアド・クエリー式でも使用できます。CTXSYS
ユーザーは、どのユーザーのストアド・クエリー式も作成および削除できます。
構文
構文1
CTX_QUERY.STORE_SQE( query_name IN VARCHAR2, text_query IN VARCHAR2 duration IN NUMBER default CTX_QUERY.DURATION_SESSION );
構文2
CTX_QUERY.STORE_SQE_CLOB_SYNTAX( query_name IN VARCHAR2, text_query IN CLOB duration IN NUMBER default CTX_QUERY.DURATION_SESSION );
作成するストアド・クエリー式の名前を指定します。
query_name
に関連付ける問合せ式を指定します。
可能な値はDURATION_SESSION
とDURATION_PERSISTENT
です。
duration
をDURATION_SESSION
に設定すると、ストアド・クエリー式はPL/SQLパッケージ変数に格納され、セッションに使用できます。
duration
がDURATION_PERSISTENT
に設定されると、ストアド・クエリー式はデータベース表に格納され、他のデータベース・セッションで参照できます。
query_name
ネームスペースは、永続SQEとセッション期間SQEの間で共有されます。他の永続SQEまたはセッション期間SQEによってすでに使用されている名前で永続SQEまたはセッション期間SQEを追加しようとすると、エラーが発生します。
CLOB問合せがある場合は、期間をデータベース表に格納するように指定します。このSQEは、不要になった時点で削除されます。
query_name
ネームスペースは、永続SQEとセッション期間SQEの間で共有されます。他の永続SQEまたはセッション期間SQEによってすでに使用されている名前で永続SQEまたはセッション期間SQEを追加しようとすると、エラーが発生します。
例
begin ctx_query.store_sqe('dis1', 'flood', CTX_QUERY.DURATION_SESSION); ctx_query.store_sqe('dis2', 'tornado', CTX_QUERY.DURATION_PERSISTENT); ctx_query.store_sqe('dis3', 'fire') end; /