スケーラブルデータベースサーバ HiRDB Version 8 UAP開発ガイド

[目次][索引][前へ][次へ]

5.2 プラグイン提供関数の制限

プラグイン提供関数とは,プラグインが提供する関数のことを指します。

<この節の構成>
(1) プラグイン提供関数間の値の受け渡しに関する制限
(2) プラグイン提供関数の実行方法に関する制限
(3) 受渡し値を格納したリストについての注意事項

(1) プラグイン提供関数間の値の受け渡しに関する制限

(a) プラグイン提供関数の種類

プラグイン提供関数の種類を次の表に示します。

表5-1 プラグイン提供関数の種類

関数の種類 プラグインの処理
受け渡しする値を生成し,ほかのプラグイン提供関数に送信する処理 ほかのプラグイン提供関数から送信された,受け渡しする値を受信する処理
受け渡しする値がない関数 なし なし
受け渡しする値を受信する関数※1 なし あり
受け渡しする値を送信する関数※2 あり なし
受け渡しする値を送受信する関数 あり あり

注※1
例えば,HiRDB Text Search Plug-inの場合,scoreを示します。

注※2
例えば,HiRDB Text Search Plug-inの場合,contains_with_scoreを示します。

 

プラグイン提供関数の機能として,プラグイン提供関数間で値の受け渡しができます。プラグイン提供関数間の値の受け渡しは,HiRDBが自動的にするので,受け渡しする値をプラグイン提供関数の引数に指定する必要はありません。

プラグイン提供関数の種類によっては,SQL中に記述できる場所が異なるので注意する必要があります。プラグイン提供関数の種類については,各種プラグインマニュアルを参照してください。

なお,これ以降の説明では用語を次のように略します。

(b) 受渡し値送信関数と受渡し値受信関数の対応

受渡し値送信関数と受渡し値受信関数の対応についての規則を次に示します。

受渡し値受信関数と受渡し値送信関数の組み合わせと,HiRDBの動作を次の表に示します。

表5-2 受渡し値受信関数と受渡し値送信関数との組み合わせ

受渡し値受信関数の指定 受渡し値送信関数の指定 HiRDBの動作
なし なし 実行できます。
あり
あり なし 実行できません。
あり(一つ) 実行できます。
あり(二つ以上) 実行できません。

注※
リストから受渡し値を取得する場合,受渡し値送信関数と受渡し値受信関数は,複数の問合せにわたって指定できます。
(c) 各プラグイン提供関数の制限

(2) プラグイン提供関数の実行方法に関する制限

(a) プラグイン提供関数の実行方法

プラグイン提供関数を実行する方法には,次の二つがあります。

プラグイン提供関数には,インデクス型プラグインを使用しないと実行できない関数(インデクス型プラグイン専用関数)があります。

HiRDBがインデクス型プラグイン専用関数を実行する場合に,インデクス型プラグインを使用できないと判断したときはエラーとなります。エラーとなる組み合わせを次の表に示します。プラグイン提供関数が,インデクス型プラグイン専用関数であるかどうかについては,各種プラグインマニュアルを参照してください。

表5-3 プラグイン提供関数実行時にエラーとなる組み合わせ

インデクス型プラグインを使用して関数を実行する方法 インデクス型プラグインを使用しないで関数を実行する方法 HiRDBが選択した検索方式
インデクス型プラグインを使用する検索 インデクス型プラグインを使用しない検索
提供されている 提供されている
提供されている 提供されていない ×
提供されていない 提供されている

(凡例)
○:実行できます。
×:実行時にエラーとなります。
−:該当しません。

注※
インデクス型プラグイン専用関数です。例えば,HiRDB Text Search Plug-inの場合は,contains及びcontains_with_scoreを指します。
(b) インデクス型プラグイン専用関数の実行方法に関する制限

インデクス型プラグイン専用関数を使用する場合には,次の制限があります。

  1. 第1引数には,外への参照列を除く実表の列指定だけ指定できます。
  2. 第1引数を除く引数に,次の値式を含む引数を指定できません。
    • 外への参照列を除く列指定
    • 列に対するコンポネント指定
  3. インデクス型プラグイン専用関数は,WHERE句,又はON 探索条件に指定できます。
  4. 外結合を指定した問合せ指定のWHERE句に,インデクス型プラグイン専用関数を指定する場合,第1引数には外結合の内表になる列は指定できません。例を次に示します。

    [図データ]

  5. 外結合を指定した結合表のON 探索条件にインデクス型プラグイン専用関数を指定する場合,第1引数に次の列は指定できません。
    • 外表の列
    • 内表が外結合を含む結合表の場合,内表に含まれる外結合の内表の列
  6. FROM句に2表以上の指定がある場合,インデクス型プラグイン専用関数の第1引数の列と異なる表の列を,ORのオペランドの探索条件中には指定できません。ただし,WHERE句,及びON 探索条件中に論理演算子NOTを含む場合は,ド・モルガンの定理によって論理演算子NOTを排除した結果,上記の条件を満たさないときは指定できます。また,UNIONを使用すると,上記の条件を満たしていても実行できる場合があります。例を次に示します。
    (例)
     
        SELECT T1.C1,T2.C2 FROM T1,T2
          WHERE T1.C1=10 AND ( (CONTAINS(T2.ADT,'ABC') IS TRUE)
                            OR (CONTAINS(T2.ADT,'DEF') IS TRUE) )
     
    このSQLを,UNIONを使用して表すと次のようになります。
     
        ( SELECT T1.C1,T2.C2 FROM T1,T2
           WHERE T1.C1=10 AND (CONTAINS(T1.ADT,'ABC') IS TRUE)
         UNION ALL
           SELECT T1.C1,T2.C2 FROM T1,T2
               WHERE T1.C1=10 AND (CONTAINS(T2.ADT,'DEF') IS TRUE))
         EXCEPT ALL
           SELECT T1.C1,T2.C2 FROM T1,T2
               WHERE T1.C1=10 AND (CONTAINS(T2.ADT,'DEF') IS TRUE)
                     AND (CONTAINS(T1.ADT,'ABC') IS TRUE)
     
    注※
    次のようなSQL文があるとします。
     
        SELECT T1.C1,T2.C2 FROM T1,T2
          WHERE NOT(CONTAINS(T1.ADT, ... ) IS NOT TRUE AND T1.C1=10)
          AND T1.C1=T2.C1
     
    これを,ド・モルガンの定理で論理演算子NOTを排除すると,次のようになります。
     
        SELECT T1.C1,T2.C2 FROM T1,T2
          WHERE (CONTAINS(T1.ADT, ... ) IS TRUE OR T1.C1<>10)
          AND T1.C1=T2.C1
     
  7. CASE式中,及びCAST指定中には指定できません。
  8. インデクス型プラグイン専用関数に対して,IS FALSE,IS UNKNOWN,及び否定(NOT)が含まれる述語は指定できません。

これらの制限に関する例を次に示します。

(例1)
WHERE句にインデクス型プラグイン専用の受渡し値送信関数の指定がある場合,一つの問合せ指定中にその受渡し値送信関数と同一表の列を第1引数に持つインデクス型プラグイン専用関数を指定できない例を次に示します。
  
  SELECT C1,C2,score(SENTENCES) FROM T1
     WHERE contains(SENTENCES, … ) IS TRUE
         AND contains_with_score(SENTENCES, … ) IS TRUE
  

(例2)
表T1,T2を外結合させて,WHERE句にインデクス型プラグイン専用関数を指定して検索する例を次に示します。
  
  SELECT T1.C1,T2.C2 FROM T1 LEFT OUTER JOIN T2
     ON T1.C1=T2.C1 WHERE contains(T1.C3, … ) IS TRUE

(3) 受渡し値を格納したリストについての注意事項

(a) リストへの受渡し値の格納

段階的に対象レコードを絞り込む場合(絞込み検索をする場合),リストへ受渡し値を格納しておくことで,受渡し値受信関数の結果を高速に取得できます。

ASSIGN LIST文を使用して実表からリストを作成する場合の探索条件に,リストに受渡し値を格納できる受渡し値送信関数を指定することで,リストに受渡し値を格納できます(ただし,ASSIGN LIST文には,リストに受渡し値を格納できる受渡し値送信関数は二つ以上指定できません)。

プラグイン提供関数が,リストに受渡し値を格納できるかどうかについては,各種プラグインマニュアルを参照してください。

また,ASSIGN LIST文を使用して,受渡し値を格納したリストから,新たなリストに受渡し値を格納することもできます。

(b) リストからの受渡し値の取得

リストを介した検索のカーソル指定の選択式に,リストから受渡し値を取得できる受渡し値受信関数(リスト用受渡し値受信関数)を指定することで,受渡し値送信関数を指定しないで,リストに格納された受渡し値を取得できます。

プラグイン提供関数が,リストから受渡し値を取得できるかどうかについては,各種プラグインマニュアルを参照してください。

リストを介した検索のカーソル指定の選択式に,リストから受渡し値を取得できる受渡し値受信関数を指定した場合,HiRDBはリストに受渡し値を格納した受渡し値送信関数の種別を意識しないで受渡し値を取得します。そのため,必ずリストを作成したときに指定した,受渡し値送信関数に対応する受渡し値受信関数を指定してください。

(c) リスト間の集合演算実行方法の種類

リスト間の集合演算をする場合,リスト作成時に探索条件に指定した受渡し値送信関数によって,集合演算実行方法が変わります。

「リスト名1 {AND|OR|AND NOT|ANDNOT} リスト名2」の集合演算結果の受渡し値を次の表に示します。

表5-4 集合演算結果の受渡し値

リスト名1作成時の受渡し値送信関数※1 リスト名2作成時の受渡し値送信関数※1
リストに受渡し値を格納できる場合 そのほかの場合
「絞込み対象受渡し値使用」指定あり 集合演算方法の指定なし
リストに受渡し値を格納できる場合 「絞込み対象受渡し値使用」指定あり × × リスト名1の受渡し値※2
集合演算方法の指定なし × × ×
そのほかの場合 × × なし

(凡例)
×:実行できません。

注※1
集合演算方法の指定のある受渡し値送信関数については,各種プラグインマニュアルを参照してください。

注※2
OR演算結果で受渡し値がない場合は,ナル値となります。