Hitachi

ノンストップデータベース HiRDB Version 10 UAP開発ガイド


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

〈この項の構成〉

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

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

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

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

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

インデクス型プラグインを使用して関数を実行する方法

インデクス型プラグインを使用しないで関数を実行する方法

HiRDBが選択した検索方式

インデクス型プラグインを使用する検索

インデクス型プラグインを使用しない検索

提供されている

提供されている

提供されている

提供されていない

×

提供されていない

提供されている

(凡例)

○:実行できます。

×:実行時にエラーとなります。

−:該当しません。

注※

インデクス型プラグイン専用関数です。例えば,HiRDB Text Search Plug-inの場合は,contains及びcontains_with_scoreを指します。

(2) インデクス型プラグイン専用関数の実行方法に関する制限

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

  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