SQL 解説書

CREATE TYPE (構造化)

CREATE TYPE ステートメントは、ユーザー定義の構造タイプを定義します。 ユーザー定義構造タイプには、属性を含めないこともできますし、 複数の属性も含めることもできます。 構造タイプには、スーパータイプからの属性を継承するサブタイプを指定することができます。 ステートメントの実行が正常に完了すると、 属性値の検索と更新のためのメソッドが生成されます。 また、このステートメントの実行が正常に完了すると、 列内で使用する構造タイプのインスタンスを作成する関数と、 該当の参照タイプとその表示タイプとをキャストする関数、 およびその参照タイプ上の比較演算子 (=、<>、<、<=、>、 および >=) をサポートする関数も生成されます。

また、CREATE TYPE ステートメントは、 ユーザー定義構造タイプと一緒に使用されるユーザー定義メソッドの任意のメソッド仕様も定義します。

呼び出し

このステートメントは、アプリケーション・プログラムに組み込むか、 または動的 SQL ステートメントを使用して発行することができます。 このステートメントは、動的に準備可能な実行可能ステートメントです。 しかし、バインド・オプション DYNAMICRULES BIND を適用する場合、 ステートメントを動的に準備することはできません (SQLSTATE 42509)。

許可

このステートメントの許可 ID には、以下の特権が少なくとも 1 つ含まれている必要があります。

UNDER が指定されていて、 このステートメントの許可 ID がタイプ階層のルート・タイプの定義者と同じではない場合には、 SYSADM または DBADM 権限が必要です。

構文

>>-CREATE TYPE--type-name----+-------------------------+-------->
                             '-UNDER--supertype-name---'
 
>-----+---------------------------------------------+--*-------->
      |        .-,---------------------------.      |
      |        V                             |      |
      '-AS--(-----| attribute-definition |---+---)--'
 
      .-INSTANTIABLE-----.
>-----+------------------+--*---+-------------------------+--*-->
      '-NOT INSTANTIABLE-'      '-INLINE LENGTH--integer--'
 
     .-WITHOUT COMPARISONS-.       .-NOT FINAL-.
>----+---------------------+---*---+-----------+---*------------>
 
>----MODE DB2SQL---*----+-----------------------+--*------------>
                        '-WITH FUNCTION ACCESS--'
 
>-----+--------------------------+------------------------------>
      '-REF USING--| rep-type |--'
 
>----*--+---------------------------------------+--*------------>
        '-CAST (SOURCE AS REF) WITH--funcname1--'
 
>-----+----------------------------------------+--*------------->
      '-CAST (REF AS SOURCE) WITH--funcname2---'
 
>-----+----------------------------------+---------------------><
      |  .-,--------------------------.  |
      |  V                            |  |
      '----| method-specification |---+--'
 
attribute-definition
 
|---attribute-name--| data-type |----+----------------------+---|
                                     +-| lob-options |------+
                                     '-| datalink-options |-'
 
rep-type
 
|---+-SMALLINT-----------------------------------------------------------------------+->
    +-+-INTEGER-+--------------------------------------------------------------------+
    | '-INT-----'                                                                    |
    +-BIGINT-------------------------------------------------------------------------+
    +--+-DECIMAL-+---+----------------------------------+----------------------------+
    |  +-DEC-----+   '-(--integer--+-------------+---)--'                            |
    |  +-NUMERIC-+                 '-,--integer--'                                   |
    |  '-NUM-----'                                                                   |
    +--+--+-CHARACTER-+---+------------+----------------+---+----------------------+-+
    |  |  '-CHAR------'   '-(integer)--'                |   |  (1)                 | |
    |  '--+-VARCHAR-------------------+--(--integer--)--'   '--------FOR BIT DATA--' |
    |     '--+-CHARACTER-+---VARYING--'                                              |
    |        '-CHAR------'                                                           |
    |                                                                                |
    +-GRAPHIC--+------------+--------------------------------------------------------+
    |          '-(integer)--'                                                        |
    '-VARGRAPHIC--(--integer--)------------------------------------------------------'
 
>---------------------------------------------------------------|
 
method-specification
 
|---METHOD--method-name----------------------------------------->
 
>----(--+----------------------------------------------------------+---)->
        |  .-,--------------------------------------------------.  |
        |  V                                                    |  |
        '----+-----------------+---data-type2--+-------------+--+--'
             '-parameter-name--'               '-AS LOCATOR--'
 
>----*---RETURNS------------------------------------------------>
 
>-----+-data-type3--+-------------+------------------------+---->
      |             '-AS LOCATOR--'                        |
      '-data-type4--CAST FROM--data-type5--+-------------+-'
                                           '-AS LOCATOR--'
 
>----*----+--------------------------+--*----------------------->
          '-SPECIFIC--specific-name--'
 
>-----+-----------------+--*------------------------------------>
      '-SELF AS RESULT--'
 
      .-| SQL-routine-characteristics |-------.
>-----+---------------------------------------+--*--------------|
      '-| external-routine-characteristics |--'
 
SQL-routine-characteristics
 
        .-LANGUAGE SQL-.        .-NOT DETERMINISTIC--.
|---*---+--------------+---*----+--------------------+--*------->
                                '-DETERMINISTIC------'
 
      .-NO EXTERNAL ACTION--.       .-READS SQL DATA--.
>-----+---------------------+--*----+-----------------+--*------>
      '-EXTERNAL ACTION-----'       '-CONTAINS SQL----'
 
      .-CALLED ON NULL INPUT--.
>-----+-----------------------+--*------------------------------|
 
external-routine-characteristics
 
|---*---LANGUAGE--+-C----+--*---PARAMETER STYLE--+-DB2SQL-----+->
                  +-JAVA-+                       '-DB2GENERAL-'
                  '-OLE--'
 
          .-NOT DETERMINISTIC--.       .-FENCED-----.
>----*----+--------------------+--*----+------------+--*-------->
          |               (2)  |       '-NOT FENCED-'
          '-DETERMINISTIC------'
 
      .-CALLED ON NULL INPUT------------.
>-----+---------------------------------+--*---NO SQL---*------->
      |                            (3)  |
      '-RETURNS NULL ON NULL INPUT------'
 
      .-NO EXTERNAL ACTION--.       .-NO SCRATCHPAD----------.
>-----+---------------------+--*----+------------------------+-->
      '-EXTERNAL ACTION-----'       |             .-100----. |
                                    '-SCRATCHPAD--+--------+-'
                                                  '-length-'
 
          .-NO FINAL CALL--.       .-ALLOW PARALLEL----.
>----*----+----------------+--*----+-------------------+--*----->
          '-FINAL CALL-----'       '-DISALLOW PARALLEL-'
 
      .-NO DBINFO--.
>-----+------------+--*-----------------------------------------|
      '-DBINFO-----'
 

注:

  1. FOR BIT DATA 文節とその後に続く他の列制約とは、任意の順序で指定できます。

  2. DETERMINISTIC の代わりに NOT VARIANT を、 また NOT DETERMINISTIC の代わりに VARIANT を指定することができます。

  3. CALLED ON NULL INPUT の代わりに NULL CALL を、 また RETURNS NULL ON NULL INPUT の代わりに NOT NULL CALL を指定できます。

説明

type-name
タイプの名前を指定します。 名前 (暗黙または明示の修飾子を含む) は、 カタログに既に記述されているその他のタイプ (組み込みタイプ、 構造タイプ、特殊タイプを含む) と同じであってはなりません。 非修飾名は、組み込みデータ・タイプ名または BOOLEAN と 同一のものであってはなりません (SQLSTATE 42918)。 動的 SQL ステートメントでは、CURRENT SCHEMA 特殊レジスターは、 修飾子のないオブジェクト名の修飾子として使用されます。 静的 SQL ステートメントでは、 QUALIFIER プリコンパイル / バインド・オプションにより、 修飾子のないオブジェクト名の修飾子が暗黙指定されます。

スキーマ名 (明示指定または暗黙指定) は、8 バイト以下でなければなりません (SQLSTATE 42622)。

述部のキーワードとして使用される多くの名前は、システム使用に予約されており、 type-name として使用することはできません (SQLSTATE 42939)。 それに含まれる名前は、 SOME、 ANY、 ALL、 NOT、 AND、 OR、 BETWEEN、 NULL、 LIKE、 EXISTS、 IN、 UNIQUE、 OVERLAPS、 SIMILAR、 MATCH、 および 基本述部に記載されている比較演算子です。

2 つの部分からなる type-name を指定する場合、 スキーマ名を "SYS" で始めることはできません。 違反すると、エラー (SQLSTATE 42939) になります。

UNDER supertype-name
この構造タイプが指定した supertype-name のサブタイプであることを指定します。 supertype-name は既存の構造タイプを指定する必要があります (SQLSTATE 42704)。 supertype-name がスキーマ名なしで指定される場合、 SQL パスでスキーマを検索することにより、タイプは解決されます。 構造タイプには、上位タイプの属性すべてと、 それに続く attribute-definition の追加属性が含められます。

attribute-definition
構造タイプの属性を定義します。

attribute-name
属性の名前です。 この構造タイプのその他の属性または上位タイプと同じ attribute-name を付けることはできません (SQLSTATE 42711)。

述部のキーワードとして使用される多くの名前は、システム使用に予約されており、 attribute-name として使用することはできません (SQLSTATE 42939)。 それに含まれる名前は、 SOME、 ANY、 ALL、 NOT、 AND、 OR、 BETWEEN、 NULL、 LIKE、 EXISTS、 IN、 UNIQUE、 OVERLAPS、 SIMILAR、 MATCH、 および 基本述部に記載されている比較演算子です。

data-type
属性のデータ・タイプです。 CREATE TABLE (LONG VARCHAR、 LONG VARGRAPHIC を除く) でリストされているデータ・タイプの 1 つで、 LONG VARCHAR または LONG VARGRAPHIC に基づいた特殊タイプです (SQLSTATE 42601)。 このデータ・タイプは既存のデータ・タイプを指定する必要があります (SQLSTATE 42704)。 data-type がスキーマ名なしで指定される場合、 SQL パスでスキーマを検索することにより、タイプは解決されます。 CREATE TABLEに種々のデータ・タイプの説明が記載されています。 属性データ・タイプが参照タイプである場合、 参照するターゲット・タイプはこのステートメントに既に存在する構造タイプであるか、 またはこのステートメントで作成されたものでなければなりません (SQLSTATE 42704)。

タイプ DATALINK の属性を使って定義された構造タイプは、 タイプ付き表またはタイプ付き視点のデータ・タイプとしてのみ有効に使用することができます (SQLSTATE 01641)。

実行時に、該当タイプのインスタンスが、 同一タイプまたはそのサブタイプの別のインスタンスを直接または間接に取り込むことを許容するタイプ定義を防止するため、 その属性のいずれかが、自身を直接または間接に使用する仕方でタイプを定義することはできません (SQLSTATE 428EP)。 詳細は、構造タイプを参照してください。

lob-options
LOB タイプと関連したオプション (あるいは LOB に基づく特殊タイプ) を指定します。 lob-options の詳細については、CREATE TABLEを参照してください。

datalink-options
DATALINK タイプと関連したオプション (あるいは DATALINK タイプに基づく特殊タイプ) を指定します。 datalink-options の詳細については、CREATE TABLEを参照してください。

DATALINK タイプまたは DATALINK に基づいている特殊タイプでオプションが指定されないと、 LINKTYPE URL および NO LINK CONTROL オプションがデフォルト値になることに注目してください。

INSTANTIABLE または NOT INSTANTIABLE
構造タイプのインスタンスを作成できるかどうかを指定します。 インスタンス化不能な構造タイプとは、以下のような意味です。

インスタンス化不能タイプのインスタンスを作成するには、 インスタンス化可能サブタイプを作成する必要があります。 NOT INSTANTIABLE を指定すると、新規のタイプのインスタンスを作成できなくなります。

INLINE LENGTH integer
このオプションは、表の行内の残りの値とインラインで保管する 構造タイプ列のインスタンスの最大サイズ (バイト数) を指示します。 指定したインライン長よりも長い構造タイプまたはそのサブタイプのインスタンスは、 LOB 値が処理されるのと同様の方法で、基礎表行とは別に保管されます。

指定した INLINE LENGTH が、新たに作成したタイプのコンストラクター関数の結果サイズ よりも小さく (32 バイトに、属性ごとに 10 バイトを加算したもの)、 しかも 292 バイトより小さいと、エラーが生じます (SQLSTATE 429B2)。 属性数には、タイプのスーパータイプから継承されたすべての属性が含まれることに注意してください。

タイプの INLINE LENGTH は、指定値またはデフォルト値のどちらであっても、 構造タイプを使用する列のデフォルトのインライン長になります。 このデフォルトは、CREATE TABLE 時にオーバーライドすることができます。

タイプ付き表のタイプとして構造タイプを使用すると、INLINE LENGTH には何の意味もなくなります。

構造タイプのデフォルトの INLINE LENGTH はシステムによって計算されます。 この後に示す公式では、以下のような用語を使います。

短い属性 (short attribute)
SMALLINT、 INTEGER、 BIGINT、 REAL、 DOUBLE、 FLOAT、 DATE、 または TIME のデータ・タイプのいずれかをもつ属性を指します。 さらに、これらのタイプに基づいた特殊タイプまたは参照タイプも含まれます。

短くない属性 (non-short attribute)
残りのデータ・タイプのいずれか、 またはこれらのデータ・タイプに基づく特殊タイプの属性を指します。

システムは、次のようにデフォルトのインライン長を計算します。

  1. 次のような公式を使って、短くない属性の追加スペース所要量を割り出します。

    space_for_non_short_attributes = SUM(attributelength + n)

    n は以下のように定義されます。

    • ネストされた構造タイプの属性には 0 バイト
    • 非 LOB 属性には 2 バイト
    • LOB 属性には 9 バイト

    attributelength は、表 25 に示すとおり、 属性に指定されているデータ・タイプに基づく値です。

  2. 次のような公式を使って、デフォルトの合計インライン長を計算します。

    default_length(structured_type) = (number_of_attributes * 10) + 32 + space_for_non-short_attributes

    number_of_attributes は、 スーパータイプから継承される属性も含めた構造タイプの合計属性数です。 ただし、number_of_attributes には、 structured_type の任意のサブタイプに定義されているどの属性も含まれません。


表 25. 属性データ・タイプのバイト・カウント
属性データ・タイプ バイト・カウント
DECIMAL (p/2)+1 の整数部分 (p は精度)
CHAR (n) n
VARCHAR (n) n
GRAPHIC (n) n * 2
VARGRAPHIC (n) n * 2
TIMESTAMP 10
DATALINK(n) n + 54
LOB タイプ 各 LOB 属性は、構造タイプ・インスタンス内に、 実際の値の位置へのポインターとなる LOB 記述子を持っています。 その記述子のサイズは、その LOB 属性に定義されている最大長によって異なります。
LOB の最大長 LOB 記述子のサイズ
1 024 72
8 192 96
65 536 120
524 000 144
4 190 000 168
134 000 000 200
536 000 000 224
1 070 000 000 256
1 470 000 000 280
2 147 483 647 316
特殊タイプ 特殊タイプのソース・タイプの長さ。
参照タイプ 参照タイプの基礎となる組み込みデータ・タイプの長さ。
構造タイプ inline_length(attribute_type)

WITHOUT COMPARISONS
構造タイプのインスタンスで比較関数がサポートされていないことを示します。

NOT FINAL
この構造タイプを上位タイプとして使用できることを示します。

MODE DB2SQL
この文節は必須であり、 このタイプでコンストラクター関数を直接呼び出すのに使います。

WITH FUNCTION ACCESS
将来作成されるメソッドを含め、該当タイプとそのサブタイプのすべてのメソッドに対して、 関数表記を使ってアクセスできることを指示します。 この文節を指定できるのは、 UNDER 文節が指定されていない構造タイプの階層のルート・タイプだけです (SQLSTATE 42613)。 この文節が備えられているのは、 メソッドを呼び出す表記よりもこの形式の表記のほうが望ましいアプリケーションで、 関数表記を使えるようにするためです。

REF USING rep-type
この構造タイプの参照タイプの表示 (基礎データ・タイプ) として使われる 組み込みデータ・タイプとそのサブタイプをすべて定義します。 この文節を指定できるのは、 UNDER 文節が指定されていない構造タイプの階層のルート・タイプだけです (SQLSTATE 42613)。 rep-type は、 LONG VARCHAR、 LONG VARGRAPHIC、 BLOB、 CLOB、 DBCLOB、 DATALINK、 または構造タイプであってはならず、 255 バイト以下の長さでなければなりません (SQLSTATE 42613)。

構造タイプの階層のルート・タイプにこの文節を指定しない場合、 REF USING VARCHAR(16) FOR BIT DATA が想定されます。

CAST (SOURCE AS REF) WITH funcname1
システムにより生成される関数で、データ・タイプ rep-type が付いた値を、 この構造タイプの参照タイプにキャストする関数の名前を定義します。 funcname1 の一部として スキーマ名を指定することはできません (SQLSTATE 42601)。 cast 関数は、構造タイプと同じスキーマ内で生成されます。 文節を指定しないと、 funcname1 のデフォルト値は type-name (構造タイプの名前) になります。 funcname1(rep-type) に一致する関数シグニチャーが、 同じスキーマ内に存在してはなりません (SQLSTATE 42710)。

CAST (REF AS SOURCE) WITH funcname2
システムにより生成される関数で、この構造タイプの参照タイプ値を、 データ・タイプ rep-type にキャストする関数の名前を定義します。 funcname2 の一部としてスキーマ名を指定することはできません (SQLSTATE 42601)。 cast 関数は、構造タイプと同じスキーマ内で生成されます。 文節を指定しないと、 funcname2 のデフォルト値は rep-type (表示タイプの名前) になります。

method-specification
このタイプのメソッドを定義します。 メソッドは、CREATE METHOD ステートメントで本体を与えられてはじめて、 実際に使用できるようになります (SQLSTATE 42884)。

method-name
定義しようとするメソッドを指定します。 これは、修飾されていない SQL 識別子でなければなりません (SQLSTATE 42601)。 メソッド名は、CREATE TYPE に使用されるスキーマで暗黙的に修飾されます。

述部のキーワードとして使用される多くの名前は、システム使用に予約されており、 method-name として使用することはできません (SQLSTATE 42939)。 それに含まれる名前は、 SOME、 ANY、 ALL、 NOT、 AND、 OR、 BETWEEN、 NULL、 LIKE、 EXISTS、 IN、 UNIQUE、 OVERLAPS、 SIMILAR、 MATCH、 および 基本述部に記載されている比較演算子です。

一般に、メソッドのシグニチャーがそれぞれ異なっている場合は、 同じ名前を複数のメソッドに使用することができます。

parameter-name
パラメーター名を指定します。 その名前は SELF であってはなりません。 これは、メソッドの暗黙のサブジェクト・パラメーターの名前です (SQLSTATE 42734)。 メソッドが SQL メソッドである場合、 そのすべてのパラメーターに名前が付いていなければなりません (SQLSTATE 42629)。

data-type2
各パラメーターのデータ・タイプを指定します。 メソッドが受け取るはずの各パラメーターごとに 1 つの項目をこのリストに指定する必要があります。 暗黙の SELF パラメーターを含め、90 を超える数のパラメーターを使うことはできません。 この限界を超えると、エラーになります (SQLSTATE 54023)。

CREATE TABLE ステートメントに列タイプとして指定でき、 しかもメソッドの作成に使用されている言語に対応するような SQL データ・タイプ指定と省略形を、 指定することができます。 ユーザー定義関数とメソッドに関する SQL データ・タイプとホスト言語データ・タイプの対応については、 「DB2 アプリケーション開発の手引き」の言語別の項を参照してください。
注:該当する SQL データ・タイプが構造タイプである場合、 ホスト言語データ・タイプに対するデフォルト・マッピングはありません。 構造タイプとホスト言語データ・タイプとをマッピングするには、 ユーザー定義の変形関数を使用する必要があります。

DECIMAL (および NUMERIC) は、LANGUAGE C と OLE では無効です (SQLSTATE 42815)。 DECIMAL の使用に代わる手法については、アプリケーション開発の手引き を参照してください。

REF を指定することができますが、これには定義された効力範囲はありません。 メソッドの本体で、まず参照タイプをキャストして効力範囲をもたせてはじめて、 パス式内でその参照タイプを使用できるようになります。 同様に、メソッドから戻された参照も、 まずキャストして効力範囲をもたせてはじめて、パス式内で使用できるようになります。

AS LOCATOR
LOB タイプまたは LOB タイプに基づく特殊タイプの場合、 AS LOCATOR 文節を追加することができます。 これは、実際の値の代わりに LOB ロケーターをメソッドに渡すことを指定します。 これにより、メソッドに渡すバイト数を大幅に減らすことができ、パフォーマンスも向上します。 メソッドにとって実際に必要になる値が数バイトだけである場合は特にそうです。 LOB ロケーターの使用法については アプリケーション開発の手引きに説明されています。

LOB 以外のタイプ、または LOB に基づく特殊タイプに対して AS LOCATOR を指定すると、 エラーが発生します (SQLSTATE 42601)。

関数が FENCED の場合や、LANGUAGE が SQL の場合、AS LOCATOR 文節は指定できません (SQLSTATE 42613)。

RETURNS
これは必須の文節であり、メソッドの結果を指定します。

data-type3
メソッドの結果のデータ・タイプを指定します。 この場合、上記のメソッドのパラメーター data-type2 の項で説明したのと全く同じ考慮事項があてはまります。

AS LOCATOR
LOB タイプまたは LOB タイプに基づく特殊タイプの場合、 AS LOCATOR 文節を追加することができます。 これは、実際の値の代わりに LOB ロケーターがメソッドから渡されることを示します。

LOB 以外のタイプ、または LOB に基づく特殊タイプに対して AS LOCATOR を指定すると、 エラーが発生します (SQLSTATE 42601)。

関数が FENCED の場合や、LANGUAGE が SQL の場合、AS LOCATOR 文節は指定できません (SQLSTATE 42613)。

data-type4 CAST FROM data-type5
メソッドの結果のデータ・タイプを指定します。

この文節は、メソッド・コードから戻されたデータ・タイプとは異なるデータ・タイプを、 呼び出しステートメントに戻すのに使用されます。 data-type5 は、 data-type4 パラメーターに対してキャスト可能でなければなりません。 キャスト可能でないと、エラーになります (SQLSTATE 42880)。

data-type4 の長さ、精度または位取りは、 data-type5 から推断することができるので、 data-type4 に指定されるパラメーター化タイプの長さ、精度、 または位取りを指定する必要はありません (指定は可能です)。 代わりに、VARCHAR() のような空の括弧を使用できます。 パラメーター値が異なるデータ・タイプ (REAL または DOUBLE) を示しているため、 FLOAT() を使用することはできません (SQLSTATE 42601)。

特殊タイプは、data-type5 に指定するタイプとしては無効です (SQLSTATE 42815)。

キャスト操作は実行時検査の対象にもなり、その結果、変換エラーになる可能性があります。

AS LOCATOR
LOB タイプまたは LOB タイプに基づく特殊タイプの場合、 AS LOCATOR 文節を追加することができます。 これは、実際の値の代わりに LOB ロケーターがメソッドから渡されることを示します。

LOB 以外のタイプ、または LOB に基づく特殊タイプに対して AS LOCATOR を指定すると、 エラーが発生します (SQLSTATE 42601)。

関数が FENCED の場合や、LANGUAGE が SQL の場合、AS LOCATOR 文節は指定できません (SQLSTATE 42613)。

SPECIFIC specific-name
定義するメソッドのインスタンスに対する固有名を指定します。 この名前は、メソッドの本体の作成やメソッドの除去のときに使用することができます。 これは、メソッドの呼び出しには使用できません。 specific-name (特定名) の非修飾形式は SQL 識別子です (最大長 18)。 修飾形式は、スキーマ名とその後に続くピリオドと SQL 識別子です。 暗黙または明示の修飾子も含め、その名前が、 アプリケーション・サーバーに存在する別の個別メソッド名を指定するものであってはなりません。 さもないと、エラーになります (SQLSTATE 42710)。

specific-name は、既存の method-name と同じでも構いません。

修飾子を指定しない場合、type-name に使用された修飾子が使用されます。 修飾子を指定する場合は、 type-name の明示または暗黙の修飾子と同じでなければなりません。 さもないと、エラーになります (SQLSTATE 42882)。

specific-name の指定がない場合、 固有の名前がデータベース・マネージャーによって生成されます。 生成される固有名は、SQL の後に文字のタイム・スタンプが続く名前です (SQLyymmddhhmmssxxx)。

SELF AS RESULT
このメソッドがタイプ保存メソッドであることを指定します。 その意味は次のとおりです。

SQL-routine-characteristics
CREATE METHOD を使ってこのタイプに定義されるメソッド本体の特性を指定します。

LANGUAGE SQL
この文節を使って、 単一の RETURN ステートメントを使って SQL でメソッドを作成することを指示します。 メソッド本体は、CREATE METHOD ステートメントを使って指定します。

NOT DETERMINISTIC または DETERMINISTIC
この文節は任意選択ですが、 特定の引き数の値に対してメソッドが常に同じ結果を戻すか (DETERMINISTIC)、 それとも状態値に応じてメソッドの結果が異なるか (NOT DETERMINISTIC) を指定します。 つまり DETERMINISTIC メソッドは、 同じ入力を行って連続して呼び出した場合に常に同じ結果を戻すことになります。 NOT DETERMINISTIC を指定すると、 同じ入力によって常に同じ結果が生じる利点に基づく最適化ができなくなります。 メソッド本体が特殊レジスターにアクセスしたり、 別の非 deterministic ルーチンを呼び出したりする場合、 明示的または暗黙的に NOT DETERMINISTIC を指定しなければなりません (SQLSTATE 428C2)。

NO EXTERNAL ACTION または EXTERNAL ACTION
この文節は任意選択であり、 データベース・マネージャーによって管理されていないオブジェクトの状態を変更する処置を メソッドが行うか否かを指定します。 EXTERNAL ACTION を指定すると、 外部からメソッドへの影響がないことを前提とした最適化ができなくなります。 (たとえば、メッセージの送信、警報音による通知、ファイルへのレコードの書き込みなど。)

READS SQL DATA または CONTAINS SQL
どのタイプの SQL ステートメントを実行できるかを指示します。 サポートされている SQL ステートメントは RETURN ステートメントであるので、 式が副照会であるかどうかで区別を行います。

READS SQL DATA
SQL データを変更しない SQL ステートメントを、 メソッドで実行できることを指定します (SQLSTATE 42985)。 SQL ステートメント内でニックネームを参照することはできません (SQLSTATE 42997)。

CONTAINS SQL
SQL データの読み取りも変更も行わない SQL ステートメントを、 メソッドで実行できることを指定します (SQLSTATE 42985)。

CALLED ON NULL INPUT
この任意選択文節は、 引き数がヌル値か否かに関係なくユーザー定義メソッドを呼び出すことを指定します。 これは、ヌル値を戻す場合も、通常の (ヌル値以外の) 値を戻す場合もあります。 ただし、ヌルの引き数値の有無のテストはメソッドが行う必要があります。

値 NULL CALL は、 ファミリーの互換性用の CALLED ON NULL INPUT の同義語として使うことができます。

external-routine-characteristics

LANGUAGE
この文節は必須で、 ユーザー定義メソッドの本体が準拠している言語インターフェース規則を指定するのに使用します。

C
これは、データベース・マネージャーが、 ユーザー定義メソッドを C の関数であるかのように呼び出すことを意味します。 ユーザー定義メソッドは、 標準 ANSI C プロトタイプで定義されている C 言語の呼び出しおよびリンケージの規則に準拠していなければなりません。

JAVA
データベース・マネージャーは、 Java クラスのメソッドとしてユーザー定義メソッドを呼び出します。

OLE
データベース・マネージャーは、 OLE 自動化オブジェクトによって公開されたメソッドとして、ユーザー定義メソッドを呼び出します。 メソッドは、「OLE Automation Programmer's Reference」に説明されている OLE 自動化データ・タイプと 呼び出しメカニズムに準拠している必要があります。

LANGUAGE OLE は、Windows 32 ビット オペレーティング・システムで保管されたユーザー定義メソッドに対してのみサポートされます。

PARAMETER STYLE
この文節は、メソッドに対してパラメーターを渡し、 そこから値を戻すのに用いる規則を指定するのに使用されます。

DB2SQL
C 言語の呼び出しとリンクの規則、 または OLE 自動化オブジェクトによって公開されたメソッドに準拠する規則を、 この外部メソッドとの間でパラメーターを渡し、値を戻す場合の規則として指定します。 これは、LANGUAGE C または LANGUAGE OLE を使用する場合に指定する必要があります。

DB2GENERAL
Java クラスのメソッドとして定義された外部メソッドとの間で、 パラメーターを渡し、値を戻す場合に用いる規則を指定します。 これは、LANGUAGE JAVA を使用する場合にだけ指定する必要があります。

DB2GENERAL の同義語として値 DB2GENRL が使用可能です。

パラメーターの受け渡しの詳細については、アプリケーション開発の手引き を参照してください。

DETERMINISTIC または NOT DETERMINISTIC
この文節は任意選択ですが、 特定の引き数の値に対してメソッドが常に同じ結果を戻すか (DETERMINISTIC)、 それとも状態値に応じてメソッドの結果が異なるか (NOT DETERMINISTIC) を指定します。 つまり DETERMINISTIC メソッドは、 同じ入力を行って連続して呼び出した場合に常に同じ結果を戻すことになります。 NOT DETERMINISTIC を指定すると、 同じ入力によって常に同じ結果が生じる利点に基づく最適化ができなくなります。

NOT DETERMINISTIC メソッドの例として、 ある部署の社員の通し番号をランダムに戻すメソッドが挙げられます。 DETERMINISTIC メソッドの例として、多角形の面積を計算するメソッドが挙げられます。

FENCED または NOT FENCED
この文節は、データベース・マネージャーの操作環境のプロセスまたはアドレス空間で メソッドを実行しても「安全」か (NOT FENCED)、そうでないか (FENCED) を指定します。

メソッドが FENCED として登録されると、データベース・マネージャーは、 その内部資源 (データ・バッファーなど) を隔離して、 そのメソッドからアクセスされないようにします。 多くのメソッドは、FENCED または NOT FENCED のどちらかで実行するように選択することができます。 一般に、FENCED として実行されるメソッドは、 NOT FENCED として実行されるものと同じようには実行されません。
注:十分に検査されていないメソッドに NOT FENCED を使用すると、 DB2 の保全性に危険を招く場合があります。 DB2 では、発生する可能性のある一般的な不注意による障害の多くに対して、 いくつかの予防措置がとられていますが、 NOT FENCED ユーザー定義メソッドが使用される場合には、完全な保全性を確保できません。

FENCED を使用すると、NOT FENCED よりもデータベースの保全性の保護は強化されますが、 十分なコード化、見直し、およびテストが施されないと、 FENCED メソッドでも DB2 で不用意に障害が生じる原因になることがあります。

ほとんどのメソッドは、FENCED または NOT FENCED のどちらでも実行できるはずです。 LANGUAGE OLE を指定したメソッドには、FENCED のみを指定できます (SQLSTATE 42613)。

メソッドが FENCED の場合、AS LOCATOR 文節を指定できません (SQLSTATE 42613)。

FENCED から NOT FENCED に変更するには、 メソッドを削除してから再作成し、メソッドを再登録する必要があります。

メソッドを NOT FENCED として登録するには、SYSADM 権限、 DBADM 権限、または特殊な権限 (CREATE_NOT_FENCED) が必要です。

RETURNS NULL ON NULL INPUT または CALLED ON NULL INPUT
この任意選択文節を使用すると、非サブジェクト引き数のいずれかがヌル値の場合に、 外部メソッドを呼び出さないようにすることができます。

RETURNS NULL ON NULL INPUT が指定されており、 実行時にメソッドの引き数のいずれかがヌル値の場合、 このメソッドは呼び出されず、結果はヌル値になります。

CALLED ON NULL INPUT を指定すると、 ヌル値の引き数の数に関係なくメソッドが呼び出されます。 これは、ヌル値を戻す場合も、通常の (ヌル値以外の) 値を戻す場合もあります。 ただし、ヌルの引き数値の有無のテストはメソッドが行う必要があります。

値 NULL CALL は、上位互換またはファミリーの互換性のために、 CALLED ON NULL INPUT の同義語として使うことができます。 同様に、NOT NULL CALL は、RETURNS NULL ON NULL INPUT の同義語として使えます。

次の 2 通りの場合、この指定は無視されます。

  • 対象となる引き数がヌルの場合。 この場合、メソッドは実行されずに結果はヌルになります。
  • パラメーターがないものとしてメソッドを定義した場合。 この場合、このヌル引き数条件が成立することはありません。

NO SQL
この文節は必須で、メソッドが SQL ステートメントを発行してはならないことを指定します。 発行すると、実行時にエラーになります (SQLSTATE 38502)。

EXTERNAL ACTION または NO EXTERNAL ACTION
この文節は任意選択であり、 データベース・マネージャーによって管理されていないオブジェクトの状態を変更する処置を メソッドが行うか否かを指定します。 EXTERNAL ACTION を指定すると、 外部からメソッドへの影響がないことを前提とした最適化ができなくなります。

NO SCRATCHPAD または SCRATCHPAD length
この文節は任意選択であり、 この外部メソッドに対してスクラッチパッドを用意するか否かを指定するのに使用できます。 メソッドを再入可能にすることを強くお勧めします。 再入可能にすると、スクラッチパッドが、 呼び出しのたびにメソッドに「状態を保管」させる手段になります。

SCRATCHPAD を指定すると、ユーザー定義メソッドの最初の呼び出し時に、 その外部メソッドによって使用されるスクラッチパッドにメモリーが割り振られます。 このスクラッチパッドには、次の特性があります。

  • length を指定すると、スクラッチパッドのバイト単位のサイズを設定します。 これは 1〜32,767 でなければなりません (SQLSTATE 42820)。 デフォルト値は 100 です。
  • すべて X'00' に初期化されます。
  • その効力範囲は、該当の SQL ステートメントです。 SQL ステートメントでの外部メソッドに対する参照ごとに 1 つのスクラッチパッドがあります。

したがって、次のステートメントのメソッド X が SCRATCHPAD キーワードを指定して定義されると、 3 つのスクラッチパッドが割り当てられます。

     SELECT A, X..(A) FROM TABLEB
        WHERE X..(A) > 103 OR X..(A) < 19

ALLOW PARALLEL が指定されているか、またはデフォルト値として使用された場合、 その効力範囲は上記とは異なります。 メソッドが複数の区分で実行される場合、メソッドが処理されるそれぞれの区分において、 SQL ステートメントでのメソッドへのそれぞれの参照ごとにスクラッチパッドが割り当てられます。 同様に、区画内並行処理をオンにして照会が実行される場合、 3 つ以上のスクラッチパッドが割り当てられることがあります。

スクラッチパッドは持続します。 その内容は、外部メソッドの呼び出しごとに保存されます。 外部メソッドのある呼び出しによってスクラッチパッドに加えられた変更はいずれも、 次の呼び出し時に存続しています。 データベース・マネージャーは、各 SQL ステートメントの実行開始時に、 スクラッチパッドを初期設定します。 各副照会の実行開始時には、 データベース・マネージャーによってスクラッチパッドがリセットされます。 FINAL CALL オプションが指定されている場合、 システムは、スクラッチパッドのリセットに先立って、最終呼び出しを行います。

スクラッチパッドは、 外部メソッドが獲得できるシステム資源 (メモリーなど) の中央点として使用することもできます。 メソッドは、最初の呼び出しでメモリーを獲得し、そのアドレスをスクラッチパッドに保管して、 後の呼び出しでそれを参照することができます。

このようにシステム資源が獲得される場合、FINAL CALL キーワードも指定する必要があります。 そうすると、ステートメントの最後で特殊な呼び出しが行われ、 外部メソッドは獲得したシステム資源をすべて解放することができます。

SCRATCHPAD を指定すると、ユーザー定義メソッドを呼び出すたびに、 スクラッチパッドをアドレス指定する外部メソッドに追加の引き数が渡されます。

NO SCRATCHPAD を指定すると、外部メソッドに対してスクラッチパッドは割り振られず、渡されません。

NO FINAL CALL または FINAL CALL
この文節は任意選択であり、外部メソッドに対する最終呼び出しが行われるか否かを指定します。 このような最終呼び出しの目的は、外部メソッドが、 獲得したシステム資源すべてを解放できるようにすることです。 外部メソッドがメモリーなどのシステム資源を獲得し、 それをスクラッチパッドに固定するような状況では、 これを SCRATCHPAD キーワードと共に使用すると便利です。

FINAL CALL を指定すると、実行時に、 呼び出しのタイプを指定する外部メソッドに追加の引き数が渡されます。 呼び出しのタイプは次のとおりです。

  • 通常呼び出し。SQL 引き数が渡され、結果が戻されることが予期されます。
  • 最初の呼び出し。 この SQL ステートメントのメソッドに対する参照に対応する外部メソッドの最初の呼び出しです。 最初の呼び出しは通常呼び出しです。
  • 最終呼び出し。 外部メソッドが資源を解放できるようにするそのメソッドに対する最終呼び出しです。 最終呼び出しは、通常呼び出しではありません。 この最終呼び出しは、次の時点で行われます。
    • ステートメント終了時。これは、 カーソルの関係するステートメントでカーソルがクローズされた場合、 あるいはステートメントが実行を終了した場合に発生します。
    • トランザクション終了時。 これは、通常のステートメント終了が発生しなかった場合に発生します。 たとえば、何らかの理由で、アプリケーションのロジックが、 カーソルをクローズしないようになっている場合があります。

    WITH HOLD として定義されたカーソルがオープンされている間に、 コミット操作が発生すると、それ以降のカーソルのクローズ時、 またはアプリケーションの終了時に最終呼び出しが行われます。

NO FINAL CALL を指定すると、「呼び出しタイプ」の引き数は外部メソッドに渡されず、 最終呼び出しは行われません。

ALLOW PARALLEL または DISALLOW PARALLEL
この文節は任意選択で、メソッドへの 1 つの参照で、 メソッドの呼び出しを並列化できるか否かを指定します。 一般には、ほとんどのスカラー・メソッドは並列化可能ですが、 並列化できないメソッド (1 つのスクラッチパッドのコピーに依存するメソッドなど) もあります。 スカラー・メソッドに対して ALLOW PARALLEL または DISALLOW PARALLEL を指定すると、 DB2 はその指定を受け入れます。

メソッドにどちらのキーワードが当てはまるかを判別するには、 以下の点を検討する必要があります。

  • メソッドのすべての呼び出しが、互いに完全に独立していますか? YES の場合には、ALLOW PARALLEL を指定します。
  • メソッドを呼び出すごとに、 次の呼び出しに関係する値を提供するスクラッチパッドが更新されますか? (たとえば、 カウンターの増分によって。) YES の場合には、DISALLOW PARALLEL を指定するか、またはデフォルトを受け入れます。
  • 1 つの区分でのみ起こる必要のある外部アクションがメソッドによって実行されますか? YES の場合には、DISALLOW PARALLEL を指定するか、またはデフォルトを受け入れます。
  • コストのかかる初期化処理の実行回数を最小にするためだけに、 スクラッチパッドを使用していますか? YES の場合には、ALLOW PARALLEL を指定します。

いずれの場合も、すべての外部メソッドの本体は、 データベースのすべての区分で使用可能なディレクトリーにある必要があります。

構文図は、デフォルト値が ALLOW PARALLEL であることを示しています。 しかし、ステートメントで以下のオプションの少なくとも 1 つが指定されている場合は、 デフォルトは DISALLOW PARALLEL です。

  • NOT DETERMINISTIC
  • EXTERNAL ACTION
  • SCRATCHPAD
  • FINAL CALL

NO DBINFO または DBINFO
この文節は任意選択で、 DB2 において既知である特定の情報を追加の呼び出し時に引き数としてメソッドに渡すか (DBINFO)、 または渡さないか (NO DBINFO) を指定します。 NO DBINFO がデフォルト値です。 DBINFO は、LANGUAGE OLE ではサポートされません (SQLSTATE 42613)。

DBINFO を指定すると、以下の情報をもつ構造がメソッドに渡されます。

  • データベース名 - 現在接続されているデータベースの名前。
  • アプリケーション ID - データベースへの接続ごとに確立された、 固有のアプリケーション ID。
  • アプリケーション許可 ID - アプリケーション実行時の許可 ID。 このメソッドとアプリケーションとの中間でネストされているメソッドは無関係です。
  • コード・ページ - データベースのコード・ページを識別します。
  • スキーマ名 - 表名とまったく同じ条件のもとで、スキーマの名前が入ります。 その他の場合はブランクです。
  • 表名 - メソッド参照が UPDATE ステートメントの SET 文節の右側にある場合、 または INSERT ステートメントの VALUES リストの項目である場合のいずれかに限り、 更新または挿入される表の非修飾名が入ります。その他の場合はブランクです。
  • 列名 - 表名とまったく同じ条件のもとで、 更新または挿入される列の名前が入ります。その他の場合はブランクです。
  • データベースのバージョン / リリース - メソッドを呼び出す データベース・サーバーのバージョン、リリース、および修正レベルを識別します。
  • プラットフォーム - サーバーのプラットフォーム・タイプが入ります。
  • 表メソッドの結果の列番号 - メソッドには当てはまりません。

構造の詳細、および構造がメソッドにどのように渡されるかについては、 アプリケーション開発の手引きを参照してください。

例 1: 部門のタイプを作成します。

     CREATE TYPE DEPT AS
        (DEPT NAME     VARCHAR(20),
           MAX_EMPS INT)
           REF USING INT
        MODE DB2SQL

例 2: 従業員タイプおよびマネージャー副タイプから構成される階層タイプを作成します。

     CREATE TYPE EMP AS
       (NAME      VARCHAR(32),
        SERIALNUM INT,
        DEPT      REF(DEPT),
        SALARY    DECIMAL(10,2))
        MODE DB2SQL
 
     CREATE TYPE MGR UNDER EMP AS
       (BONUS     DECIMAL(10,2))
            MODE DB2SQL

例 3: アドレスのタイプ階層を作成します。 アドレスは、列のタイプとして使用するためのものです。 インライン長は指定されていないので、DB2 がデフォルト長を計算します。 該当のアドレスが、特定の入力アドレスにどのくらい近いかを計算する外部メソッドを、 アドレス・タイプ定義内にカプセル化します。 CREATE METHOD ステートメントを使ってメソッド本体を作成します。

     CREATE TYPE address_t AS
        (STREET     VARCHAR(30),
         NUMBER     CHAR(15),
         CITY       VARCHAR(30),
         STATE      VARCHAR(10))
         NOT FINAL
         MODE DB2SQL
            METHOD SAMEZIP (addr address_t)
            RETURNS INTEGER
            LANGUAGE SQL
            DETERMINISTIC
            CONTAINS SQL
            NO EXTERNAL ACTION
 
            METHOD DISTANCE (address_t)
            RETURNS FLOAT
            LANGUAGE C
            DETERMINISTIC
            PARAMETER STYLE DB2SQL
            NO SQL
            NO EXTERNAL ACTION
 
     CREATE TYPE germany_addr_t UNDER address_t AS
        (FAMILY_NAME VARCHAR(30))
         NOT FINAL
         MODE DB2SQL
 
     CREATE TYPE us_addr_t UNDER address_t AS
         (ZIP VARCHAR(10))
          NOT FINAL
          MODE DB2SQL

例 4: ネストされた構造タイプ属性をもつタイプを作成します。

     CREATE TYPE PROJECT AS
           (PROJ_NAME  VARCHAR(20),
            PROJ_ID    INTEGER,
            PROJ_MGR   MGR,
            PROJ_LEAD  EMP,
            LOCATION   ADDR_T,
            AVAIL_DATE DATE)
            MODE DB2SQL


脚注:

85
タイプ階層に含まれる参照表示タイプはすべて同一のものです。 これにより、REF(S) と REF(T) の比較が可能になります (S と T が共通の上位タイプを持っている場合)。 表の OID 列は、表階層だけで固有になるので、1 つの表階層の REF(T) 値を 別の表階層の REF(T) 値と "等しい" ものにすることができます (それぞれが異なった行を参照していても)。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]