CREATE INDEX EXTENSION ステートメント

CREATE INDEX EXTENSION ステートメントは、構造化タイプまたは特殊タイプ列のある表で索引を使用するための拡張オブジェクトを定義します。

呼び出し

このステートメントは、アプリケーション・プログラムに組み込んだり、動的 SQL ステートメントを使用して発行したりすることができます。 これは、DYNAMICRULES の実行動作がパッケージに効力を持つ場合にのみ、動的に準備できる実行可能ステートメントです (SQLSTATE 42509)。

許可

ステートメントの許可 ID によって保持されている特権には、少なくとも以下のいずれかの権限が含まれていなければなりません。
  • データベースに対する IMPLICIT_SCHEMA 権限 (索引拡張のスキーマ名が既存のスキーマを指していない場合)
  • スキーマに対する CREATEIN 特権 (索引拡張のスキーマ名が既存のスキーマを指している場合)
  • スキーマに対する SCHEMAADM 権限 (索引拡張のスキーマ名が既存のスキーマを指している場合)
  • DBADM 権限

構文

構文図を読む構文図をスキップするCREATE INDEX EXTENSIONindex-extension-name (,parameter-name1data-type1)index-maintenanceindex-search
index-maintenance
構文図を読む構文図をスキップするFROM SOURCE KEY(parameter-name2 data-type2)GENERATE KEY USING table-function-invocation
index-search
構文図を読む構文図をスキップするWITH TARGET KEY( ,parameter-name3data-type3 )SEARCH METHODS ,search-method-definition
search-method-definition
構文図を読む構文図をスキップするWHENmethod-name( ,parameter-name4data-type4 )RANGE THROUGHrange-producing-function-invocation FILTER USINGindex-filtering-function-invocationcase-expression

説明

index-extension-name
索引拡張を指定します。 暗黙または明示の修飾子を含む名前は、 カタログに記述されている索引拡張を識別するものであってはなりません。 2 つの部分から成る index-extension-name を指定する場合、 スキーマ名を SYS で始めることはできません。 違反すると、エラーが戻されます (SQLSTATE 42939)。
parameter-name1
CREATE INDEX 時に索引拡張に渡されるパラメーターを指定して、 この索引拡張の実際の振る舞いを定義します。 索引拡張に渡されるパラメーターは、 インスタンス・パラメーター と呼ばれます。 この値が索引拡張の新しいインスタンスを定義するためです。

parameter-name1 は、索引拡張の定義内でユニークでなければなりません。 パラメーターの数は 90 を超えることはできません。 この限界を超えると、エラー (SQLSTATE 54023) になります。

data-type1
各パラメーターのデータ・タイプを指定します。 このリストには、索引拡張が受け取ることを予期している各パラメーターごとに、 1 つの項目を指定する必要があります。 指定できる SQL データ・タイプは、VARCHAR、 INTEGER、 DECIMAL、 DOUBLE、 または VARGRAPHIC など、定数として使用できるタイプだけです (SQLSTATE 429B5)。 10 進浮動小数点データ・タイプは指定できません (SQLSTATE 429B5)。 CREATE INDEX の索引拡張により受け取られるパラメーター値は、長さ、精度、およびスケールとも、 data-type1 に完全に一致していなければなりません (SQLSTATE 428E0)。

文字データ・タイプおよびグラフィック・ストリング・データ・タイプでは、CODEUNITS32 のストリング単位を指定することはできません。

index-maintenance
構造化タイプまたは特殊タイプの列の索引キーを保守する方法を指定します。 索引保守は、ソース列をターゲット・キーに変換するプロセスです。 変換プロセスは、データベースで以前に定義されている表関数を使用して定義されます。
FROM SOURCE KEY (parameter-name2 data-type2)
この索引拡張によりサポートされるソース・キー列の、構造化データ・タイプまたは特殊タイプを指定します。
parameter-name2
ソース・キー列に関連するパラメーターを指定します。 ソース・キー列は、 data-type2 と同じデータ・タイプの索引キー列です (CREATE INDEX で定義)。
data-type2
parameter-name2 のデータ・タイプを指定します。 data-type2 は、LOB、XML、または DECFLOAT を基にしたのではないユーザー定義の構造化タイプまたは特殊タイプでなければなりません (SQLSTATE 42997)。 CREATE INDEX 時に索引拡張が索引に関連付けられる場合、 索引キー列のデータ・タイプは以下のようでなければなりません。
  • 特殊タイプの場合、data-type2 に完全に一致しなければなりません。 あるいは、
  • 構造化タイプの場合、data-type2 のタイプまたはサブタイプと同じなければなりません。
これ以外の場合には、エラーになります (SQLSTATE 428E0)。
GENERATE KEY USING table-function-invocation
ユーザー定義の表関数を使用して索引キーが生成される方法を指定します。 単一のソース・キー・データ値に複数の索引項目を生成できます。 単一のソース・キー・データ値から索引項目を複製することはできません (SQLSTATE 22526)。 この関数は、引数として parameter-name1parameter-name2、または定数を使用できます。 データ・タイプ parameter-name2 が構造化データ・タイプの場合、この引数では、 この構造化タイプの observer メソッドしか使用できません (SQLSTATE 428E3)。 TARGET KEY 指定では、GENERATE KEY 関数の出力を指定しなければなりません。 関数の出力は、FILTER USING 節で指定される索引フィルター関数の入力としても使用できます。
table-function-invocation で使用される関数は、次のようでなければなりません。
  • 表関数に解決されること (SQLSTATE 428E4)
  • このデータベースがユニコード・データベースではない場合、 PARAMETER CCSID UNICODE で定義しないこと (SQLSTATE 428E4)
  • LANGUAGE SQL で定義されていないこと (SQLSTATE 428E4)
  • NOT DETERMINISTIC (SQLSTATE 428E4) または EXTERNAL ACTION (SQLSTATE 428E4) で定義されていないこと
  • NO SQL で定義されていること (SQLSTATE 428E4)
  • パラメーターのデータ・タイプに構造化データ・タイプ、LOB または XML がないこと (SQLSTATE 428E3)。 ただし、システム生成のオブザーバー・メソッドだけは例外です。
  • 副照会が含まれていないこと (SQLSTATE 428E3)
  • XMLQUERY または XMLEXISTS 式が含まれていないこと (SQLSTATE 428E3)
  • EXTEND USING 節なしで定義された索引の列のデータ・タイプの制限に従う データ・タイプを持つ列を戻すこと
引数が他の操作またはルーチンを呼び出す場合、 それはオブザーバー・メソッドでなければなりません (SQLSTATE 428E3)。

索引拡張の定義者は、 この関数に対する EXECUTE 特権、またはこの関数が含まれるスキーマに対する EXECUTEIN 特権か Schema DATAACCESS 権限を持っている必要があります。

index-search
検索引数から検索範囲へのマッピングを提供することにより、検索の実行方法を指定します。
WITH TARGET KEY
GENERATE KEY USING 節で指定されるキー生成関数の出力である ターゲット・キー・パラメーターを指定します。
parameter-name3
指定されるターゲット・キーに関連するパラメーターを指定します。 parameter-name3 は、 GENERATE KEY USING 節の表関数で指定された RETURNS 表の列に対応します。 指定されるパラメーターの数は、 表関数で戻される列の数と一致しなければなりません (SQLSTATE 428E2)。
data-type3
それぞれの対応する parameter-name3 のデータ・タイプを指定します。 data-type3 は、GENERATE KEY USING 節の表関数で指定されたように、 RETURNS 表のそれぞれに対応する出力列のデータ・タイプに厳密に一致しなければなりません (SQLSTATE 428E2)。 これには、長さ、精度、およびタイプが含まれます。
SEARCH METHODS
索引に定義される検索メソッドを導入します。
search-method-definition
索引検索のメソッドの詳細を指定します。 これは、メソッド名、検索引数、範囲生成関数、およびオプションの索引フィルター関数で構成されます。
WHEN method-name
検索メソッドの名前。 これは、索引活用規則 (ユーザー定義関数の PREDICATES 節にある) で指定される メソッド名に関連する SQL ID です。 検索メソッド定義で search-method-name を参照できる WHEN 節は 1 つだけです (SQLSTATE 42713)。
parameter-name4
検索引数のパラメーターを指定します。 これらの名前は、RANGE THROUGH および FILTER USING 節で使用されます。
data-type4
検索パラメーターに関連付けられるデータ・タイプ。
RANGE THROUGH range-producing-function-invocation
検索範囲を生成する外部表関数を指定します。 この関数は parameter-name1parameter-name4、 または定数を引数として使用し、検索範囲のセットを戻します。
range-producing-function-invocation で使用される表関数は、 以下のようでなければなりません。
  • 表関数に解決されること (SQLSTATE 428E4)
  • その引数に副照会 (SQLSTATE 428E3) または SQL 関数 (SQLSTATE 428E4) が含まれていないこと
  • 引数内に XMLQUERY または XMLEXISTS 式が含まれていないこと (SQLSTATE 428E3)
  • このデータベースがユニコード・データベースではない場合、 PARAMETER CCSID UNICODE で定義しないこと (SQLSTATE 428E4)
  • LANGUAGE SQL で定義されていないこと (SQLSTATE 428E4)
  • NOT DETERMINISTIC または EXTERNAL ACTION で定義されていないこと (SQLSTATE 428E4)
  • NO SQL で定義されていること (SQLSTATE 428E4)
この関数の結果の数およびタイプが、 以下のように GENERATE KEY USING 節で指定した表関数の結果に関連していること (SQLSTATE 428E1)。
  • キー・トランスフォーメーション関数で戻される数の 2 倍以内の数の列を戻す。
  • 偶数の列があり、戻りコードの前半で範囲の開始 (開始キー値) を定義し、 戻りコードの後半で範囲の終了 (停止キー値) を定義する。
  • 対応する停止キー列と同じタイプの開始キー列がある。
  • 対応するキー・トランスフォーメーション関数列と同じタイプの開始キー列がある。

厳密には、a1:t1, ..., an:tn を、関数結果列およびキー・トランスフォーメーション関数のデータ・タイプにします。range-producing-function-invocation の関数結果列は、b1:t1, ..., bm:tm, c1:t1, ..., cm:tm でなければなりません。ここで、m <= n および "b" 列は開始キー列で、"c" 列は停止キー列です。

range-producing-function-invocation が開始または停止キー値として NULL 値を戻す場合、 セマンティクスは未定義です。

索引拡張の定義者は、この関数に対して EXECUTE 特権を持っている必要があります。

FILTER USING
範囲生成関数の適用後に戻された索引項目をフィルター操作する際に使用する、 外部関数またはケース式の指定を許可します。
index-filtering-function-invocation
索引項目をフィルター操作するのに使用する外部関数を指定します。 この関数は parameter-name1parameter-name3parameter-name4、または定数を引数として使用し (SQLSTATE 42703)、 整数を戻します (SQLSTATE 428E4)。 戻される値が 1 の場合、索引項目に対応する行が表から取り出されます。 その他の場合、索引項目をさらに処理することはありません。

これを指定しない場合は、索引のフィルター操作は実行されません。

index-filtering-function-invocation で使用される関数は、以下のようでなければなりません。
  • このデータベースがユニコード・データベースではない場合、 PARAMETER CCSID UNICODE で定義しないこと (SQLSTATE 428E4)
  • LANGUAGE SQL で定義されていないこと (SQLSTATE 429B4)
  • NOT DETERMINISTIC または EXTERNAL ACTION で定義されていないこと (SQLSTATE 42845)
  • NO SQL で定義されていること (SQLSTATE 428E4)
  • どのパラメーターのデータ・タイプにも、構造化データ・タイプがないこと (SQLSTATE 428E3)
  • 副照会が含まれていないこと (SQLSTATE 428E3)
  • XMLQUERY または XMLEXISTS 式が含まれていないこと (SQLSTATE 428E3)
引数が他の関数またはメソッドを呼び出す場合、 このネストされた関数またはメソッドにもこれらの規則が課されます。 ただし、引数が組み込みデータ・タイプになるかぎり、 システム生成のオブザーバー・メソッドをフィルター関数 (または、 引数として使用される任意の関数またはメソッド) への引数として使用することができます。

索引拡張の定義者は、この関数に対して EXECUTE 特権を持っている必要があります。

case-expression
索引項目をフィルター操作するためのケース式を指定します。 searched-when-clause および simple-when-clause では、 parameter-name1parameter-name3parameter-name4、 または定数を使用できます (SQLSTATE 42703)。 FILTER USING index-filtering-function-invocation に指定された規則を使って、 外部関数を result-expression として使用できます。 case-expression で参照される関数またはメソッドはすべて、 index-filtering-function-invocation でリストされている規則に適合することも必要です。 加えて、副照会および XMLQUERY または XMLEXISTS 式は、case-expression の中では使用できません (SQLSTATE 428E4)。 ケース式は整数を戻さなければなりません (SQLSTATE 428E4)。 result-expression で戻り値が 1 の場合は索引項目が保持され、 その他の場合は索引項目は破棄されます。

  • まだ存在していないスキーマ名を用いて索引拡張を作成すると、 ステートメントの許可 ID に IMPLICIT_SCHEMA 権限がある場合に限り、 そのスキーマが暗黙的に作成されます。 スキーマの所有者は SYSIBM になります。スキーマに対する CREATEIN 特権が PUBLIC に付与されます。

この例では、gridEntry という表関数で構造化タイプ SHAPE 列を使用する索引拡張 grid_extension を作成して、7 つの索引ターゲット・キーを生成します。この索引拡張は 2 つの索引検索メソッドも提供して、 検索引数が指定される際の検索範囲を生成します。
   CREATE INDEX EXTENSION GRID_EXTENSION (LEVELS VARCHAR(20) FOR BIT DATA)
     FROM SOURCE KEY (SHAPECOL SHAPE)
     GENERATE KEY USING GRIDENTRY(SHAPECOL..MBR..XMIN,
                                   SHAPECOL..MBR..YMIN,
                                   SHAPECOL..MBR..XMAX,
                                   SHAPECOL..MBR..YMAX,
                                   LEVELS)
     WITH TARGET KEY (LEVEL INT, GX INT, GY INT,
                      XMIN INT, YMIN INT, XMAX INT, YMAX INT)
     SEARCH METHODS
     WHEN SEARCHFIRSTBYSECOND (SEARCHARG SHAPE)
     RANGE THROUGH GRIDRANGE(SEARCHARG..MBR..XMIN,
                                   SEARCHARG..MBR..YMIN,
                                   SEARCHARG..MBR..XMAX,
                                   SEARCHARG..MBR..YMAX,
                                   LEVELS)
     FILTER USING
       CASE WHEN (SEARCHARG..MBR..YMIN > YMAX) OR
          SEARCHARG..MBR..YMAX < YMIN) THEN 0
       ELSE CHECKDUPLICATE(LEVEL, GX, GY,
                                  XMIN, YMIN, XMAX, YMAX,
                                  SEARCHARG..MBR..XMIN,
                                  SEARCHARG..MBR..YMIN,
                                  SEARCHARG..MBR..XMAX,
                                  SEARCHARG..MBR..YMAX,
                                  LEVELS)
       END
     WHEN SEARCHSECONDBYFIRST (SEARCHARG SHAPE)
     RANGE THROUGH GRIDRANGE(SEARCHARG..MBR..XMIN,
                                   SEARCHARG..MBR..YMIN,
                                   SEARCHARG..MBR..XMAX,
                                   SEARCHARG..MBR..YMAX,
                                   LEVELS)
     FILTER USING
       CASE WHEN (SEARCHARG..MBR..YMIN > YMAX) OR
          SEARCHARG..MBR..YMAX < YMIN) THEN 0
       ELSE MBROVERLAP(XMIN, YMIN, XMAX, YMAX,
                                   SEARCHARG..MBR..XMIN,
                                   SEARCHARG..MBR..YMIN,
                                   SEARCHARG..MBR..XMAX,
                                   SEARCHARG..MBR..YMAX)
       END