この章では、問合せフィードバックの生成、ヒット数のカウントおよびストアド・クエリー式の生成に使用できる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;
/