SQL 解説書
CREATE INDEX EXTENSION ステートメントは、
構造タイプまたは特殊タイプ列のある表で索引を使用するための拡張オブジェクトを作成します。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込むか、
または動的 SQL ステートメントを使用して発行することができます。
このステートメントは、動的に準備可能な実行可能ステートメントです。
しかし、バインド・オプション DYNAMICRULES BIND を適用する場合、
ステートメントを動的に準備することはできません (SQLSTATE 42509)。
許可
このステートメントの許可 ID には、以下の特権が少なくとも 1 つ含まれている必要があります。
- SYSADM または DBADM 権限
- データベースに対する IMPLICIT_SCHEMA 権限 (索引拡張のスキーマ名が既存のスキーマを指していない場合)
- スキーマに対する CREATEIN 特権 (索引拡張のスキーマ名が既存のスキーマを指している場合)
構文
>>-CREATE INDEX EXTENSION--index-extension-name----------------->
>-----+--------------------------------------------+------------>
| .-,------------------------------. |
| V | |
'-(-----parameter-name1--data-type1---+---)--'
>----| index-maintenance |--| index-search |-------------------><
index-maintenance
|---FROM SOURCE KEY--(--parameter-name2--data-type2--)---------->
>----GENERATE KEY USING--table-function-invocation--------------|
index-search
.-,------------------------------.
V |
|---WITH TARGET KEY--(-----parameter-name3--data-type3---+---)-->
.-,-------------------------------.
V |
>----SEARCH METHODS-----| search-method-definition |---+--------|
search-method-definition
.-,------------------------------.
V |
|---WHEN--method-name--(-----parameter-name4--data-type4---+---)-->
>---RANGE THROUGH--range-producing-function-invocation---------->
>-----+--------------------------------------------------------+-|
'-FILTER USING--+-index-filtering-function-invocation-+--'
'-case-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)。
定数についての詳細は、定数を参照してください。
CREATE INDEX の索引拡張により受け取られるパラメーター値は、長さ、精度、およびスケールとも、
data-type1 に完全に一致していなければなりません (SQLSTATE 428E0)。
- index-maintenance
- 構造タイプまたは特殊タイプの列の索引キーを保守する方法を指定します。
索引保守は、ソース列をターゲット・キーに変換するプロセスです。
変換プロセスは、データベースで以前に定義されている表関数を使用して定義されます。
- FROM SOURCE KEY (parameter-name2 data-type2)
- この索引拡張によりサポートされるソース・キー列に、
構造データ・タイプまたは特殊タイプを指定します。
- parameter-name2
- ソース・キー列に関連するパラメーターを指定します。
ソース・キー列は、
data-type2 と同じデータ・タイプの索引キー列です (CREATE INDEX で定義)。
- data-type2
- parameter-name2 のデータ・タイプを指定します。
data-type2 は構造タイプか、あるいは LOB、DATALINK、LONG VARCHAR、
LONG VARGRAPHIC を基にしたのではない特殊タイプでなければなりません (SQLSTATE 42997)。
CREATE INDEX 時に索引拡張が索引に関連付けられる場合、
索引キー列のデータ・タイプは以下のようでなければなりません。
- 特殊タイプの場合、data-type2 に完全に一致しなければなりません。
あるいは、
- 構造タイプの場合、data-type2 のタイプまたはサブタイプと同じなければなりません。
これ以外の場合には、エラーになります (SQLSTATE 428E0)。
- GENERATE KEY USING table-function-invocation
- ユーザー定義の表関数を使用して索引キーが生成される方法を指定します。
単一のソース・キー・データ値に複数の索引項目を生成できます。
単一のソース・キー・データ値から索引項目を複製することはできません (SQLSTATE 22526)。
この関数は、引き数として parameter-name1、
parameter-name2、または定数を使用できます。
データ・タイプ parameter-name2 が構造タイプの場合、この引き数では、
この構造タイプの observer メソッドしか使用できません (SQLSTATE 428E3)。
TARGET KEY 指定では、GENERATE KEY 関数の出力を指定しなければなりません。
関数の出力は、FILTER USING 文節で指定される索引フィルター関数の入力としても使用できます。
table-function-invocation で使用される関数は、次のようでなければなりません。
- 表関数に解決されること (SQLSTATE 428E4)
- LANGUAGE SQL で定義されていないこと (SQLSTATE 428E4)
- NOT DETERMINISTIC (SQLSTATE 428E4) または EXTERNAL ACTION (SQLSTATE 428E4) で定義されていないこと
- パラメーターのデータ・タイプに構造データ・タイプ、
LOB、DATALINK、LONG VARCHAR、または LONG VARGRAPHIC がないこと (SQLSTATE 428E3)。
ただし、システム生成のオブザーバー・メソッドだけは例外です。
- 副照会が含まれていないこと (SQLSTATE 428E3)
- EXTEND USING 文節なしで定義された索引の列のデータ・タイプの制限に従う
データ・タイプを持つ列を戻すこと
引き数が他の操作またはルーチンを呼び出す場合、
それはオブザーバー・メソッドでなければなりません (SQLSTATE 428E3)。
- 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 識別子です。
検索メソッド定義で search-method-name を参照できる WHEN 文節は 1 つだけです (SQLSTATE 42713)。
- parameter-name4
- 検索引き数のパラメーターを指定します。
これらの名前は、RANGE THROUGH および FILTER USING 文節で使用されます。
- data-type4
- 検索パラメーターに関連付けられるデータ・タイプ。
- RANGE THROUGH range-producing-function-invocation
- 検索範囲を生成する外部表関数を指定します。
この関数は parameter-name1、parameter-name4、
または定数を引き数として使用し、検索範囲のセットを戻します。
range-producing-function-invocation で使用される表関数は、
以下のようでなければなりません。
- 表関数に解決されること (SQLSTATE 428E4)
- その引き数に副照会 (SQLSTATE 428E3) または SQL 関数 (SQLSTATE 428E4) が含まれていないこと
- LANGUAGE SQL で定義されていないこと (SQLSTATE 428E4)
- NOT DETERMINISTIC または EXTERNAL ACTION で定義されていないこと (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 が開始または停止キー値としてヌル値を戻す場合、
意味体系は未定義です。
- FILTER USING
- 範囲生成関数の適用後に戻された索引項目をフィルター操作する際に使用する、
外部関数またはケース式の指定を許可します。
- index-filtering-function-invocation
- 索引項目をフィルター操作するのに使用する外部関数を指定します。
この関数は parameter-name1、parameter-name3、
parameter-name4、または定数を引き数として使用し (SQLSTATE 42703)、
整数を戻します (SQLSTATE 428E4)。
戻される値が 1 の場合、索引項目に対応する行が表から取り出されます。
その他の場合、索引項目をさらに処理することはありません。
これを指定しない場合は、索引のフィルター操作は実行されません。
index-filtering-function-invocation で使用される関数は、以下のようでなければなりません。
- LANGUAGE SQL で定義されていないこと (SQLSTATE 429B4)
- NOT DETERMINISTIC または EXTERNAL ACTION で定義されていないこと (SQLSTATE 42845)
- どのパラメーターのデータ・タイプにも、構造データ・タイプがないこと (SQLSTATE 428E3)
- 副照会が含まれていないこと (SQLSTATE 428E3)
引き数が他の関数またはメソッドを呼び出す場合、
このネストされた関数またはメソッドにもこれらの 4 つの規則が課されます。
ただし、引き数が組み込みデータ・タイプになるかぎり、
システム生成のオブザーバー・メソッドをフィルター関数 (または、
引き数として使用される任意の関数またはメソッド) への引き数として使用することができます。
- case-expression
- 索引項目をフィルター操作するためのケース式を指定します。
searched-when-clause および simple-when-clause では、
parameter-name1、parameter-name3、parameter-name4、
または定数を使用できます (SQLSTATE 42703)。
FILTER USING index-filtering-function-invocation に指定された規則を使って、
外部関数を result-expression として使用できます。
case-expression で参照される関数またはメソッドはすべて、
index-filtering-function-invocation でリストされている 4 つの規則に適合することも必要です。
加えて、副照会は、case-expression の中では使用できません (SQLSTATE 428E4)。
ケース式は整数を戻さなければなりません (SQLSTATE 428E4)。
result-expression で戻り値が 1 の場合は索引項目が保持され、
その他の場合は索引項目は破棄されます。
注
- まだ存在していないスキーマ名を用いて索引拡張を作成すると、
ステートメントの許可 ID に IMPLICIT_SCHEMA 権限がある場合に限り、
そのスキーマが暗黙的に作成されます。
そのスキーマの所有者は SYSIBM です。
スキーマに対する CREATEIN 特権は PUBLIC に与えられます。
例
例 1: ここでは、
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
[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]