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-----'
注:
説明
スキーマ名 (明示指定または暗黙指定) は、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) になります。
述部のキーワードとして使用される多くの名前は、システム使用に予約されており、 attribute-name として使用することはできません (SQLSTATE 42939)。 それに含まれる名前は、 SOME、 ANY、 ALL、 NOT、 AND、 OR、 BETWEEN、 NULL、 LIKE、 EXISTS、 IN、 UNIQUE、 OVERLAPS、 SIMILAR、 MATCH、 および 基本述部に記載されている比較演算子です。
タイプ DATALINK の属性を使って定義された構造タイプは、 タイプ付き表またはタイプ付き視点のデータ・タイプとしてのみ有効に使用することができます (SQLSTATE 01641)。
実行時に、該当タイプのインスタンスが、 同一タイプまたはそのサブタイプの別のインスタンスを直接または間接に取り込むことを許容するタイプ定義を防止するため、 その属性のいずれかが、自身を直接または間接に使用する仕方でタイプを定義することはできません (SQLSTATE 428EP)。 詳細は、構造タイプを参照してください。
DATALINK タイプまたは DATALINK に基づいている特殊タイプでオプションが指定されないと、 LINKTYPE URL および NO LINK CONTROL オプションがデフォルト値になることに注目してください。
インスタンス化不能タイプのインスタンスを作成するには、 インスタンス化可能サブタイプを作成する必要があります。 NOT INSTANTIABLE を指定すると、新規のタイプのインスタンスを作成できなくなります。
指定した INLINE LENGTH が、新たに作成したタイプのコンストラクター関数の結果サイズ よりも小さく (32 バイトに、属性ごとに 10 バイトを加算したもの)、 しかも 292 バイトより小さいと、エラーが生じます (SQLSTATE 429B2)。 属性数には、タイプのスーパータイプから継承されたすべての属性が含まれることに注意してください。
タイプの INLINE LENGTH は、指定値またはデフォルト値のどちらであっても、 構造タイプを使用する列のデフォルトのインライン長になります。 このデフォルトは、CREATE TABLE 時にオーバーライドすることができます。
タイプ付き表のタイプとして構造タイプを使用すると、INLINE LENGTH には何の意味もなくなります。
構造タイプのデフォルトの INLINE LENGTH はシステムによって計算されます。 この後に示す公式では、以下のような用語を使います。
システムは、次のようにデフォルトのインライン長を計算します。
space_for_non_short_attributes = SUM(attributelength + n)
n は以下のように定義されます。
attributelength は、表 25 に示すとおり、 属性に指定されているデータ・タイプに基づく値です。
default_length(structured_type) = (number_of_attributes * 10) + 32 + space_for_non-short_attributes
number_of_attributes は、 スーパータイプから継承される属性も含めた構造タイプの合計属性数です。 ただし、number_of_attributes には、 structured_type の任意のサブタイプに定義されているどの属性も含まれません。
属性データ・タイプ | バイト・カウント | |
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) |
構造タイプの階層のルート・タイプにこの文節を指定しない場合、 REF USING VARCHAR(16) FOR BIT DATA が想定されます。
述部のキーワードとして使用される多くの名前は、システム使用に予約されており、 method-name として使用することはできません (SQLSTATE 42939)。 それに含まれる名前は、 SOME、 ANY、 ALL、 NOT、 AND、 OR、 BETWEEN、 NULL、 LIKE、 EXISTS、 IN、 UNIQUE、 OVERLAPS、 SIMILAR、 MATCH、 および 基本述部に記載されている比較演算子です。
一般に、メソッドのシグニチャーがそれぞれ異なっている場合は、 同じ名前を複数のメソッドに使用することができます。
CREATE TABLE ステートメントに列タイプとして指定でき、 しかもメソッドの作成に使用されている言語に対応するような SQL データ・タイプ指定と省略形を、 指定することができます。 ユーザー定義関数とメソッドに関する SQL データ・タイプとホスト言語データ・タイプの対応については、 「DB2 アプリケーション開発の手引き」の言語別の項を参照してください。
注: | 該当する SQL データ・タイプが構造タイプである場合、 ホスト言語データ・タイプに対するデフォルト・マッピングはありません。 構造タイプとホスト言語データ・タイプとをマッピングするには、 ユーザー定義の変形関数を使用する必要があります。 |
DECIMAL (および NUMERIC) は、LANGUAGE C と OLE では無効です (SQLSTATE 42815)。 DECIMAL の使用に代わる手法については、アプリケーション開発の手引き を参照してください。
REF を指定することができますが、これには定義された効力範囲はありません。 メソッドの本体で、まず参照タイプをキャストして効力範囲をもたせてはじめて、 パス式内でその参照タイプを使用できるようになります。 同様に、メソッドから戻された参照も、 まずキャストして効力範囲をもたせてはじめて、パス式内で使用できるようになります。
LOB 以外のタイプ、または LOB に基づく特殊タイプに対して AS LOCATOR を指定すると、 エラーが発生します (SQLSTATE 42601)。
関数が FENCED の場合や、LANGUAGE が SQL の場合、AS LOCATOR 文節は指定できません (SQLSTATE 42613)。
LOB 以外のタイプ、または LOB に基づく特殊タイプに対して AS LOCATOR を指定すると、 エラーが発生します (SQLSTATE 42601)。
関数が FENCED の場合や、LANGUAGE が SQL の場合、AS LOCATOR 文節は指定できません (SQLSTATE 42613)。
この文節は、メソッド・コードから戻されたデータ・タイプとは異なるデータ・タイプを、 呼び出しステートメントに戻すのに使用されます。 data-type5 は、 data-type4 パラメーターに対してキャスト可能でなければなりません。 キャスト可能でないと、エラーになります (SQLSTATE 42880)。
data-type4 の長さ、精度または位取りは、 data-type5 から推断することができるので、 data-type4 に指定されるパラメーター化タイプの長さ、精度、 または位取りを指定する必要はありません (指定は可能です)。 代わりに、VARCHAR() のような空の括弧を使用できます。 パラメーター値が異なるデータ・タイプ (REAL または DOUBLE) を示しているため、 FLOAT() を使用することはできません (SQLSTATE 42601)。
特殊タイプは、data-type5 に指定するタイプとしては無効です (SQLSTATE 42815)。
キャスト操作は実行時検査の対象にもなり、その結果、変換エラーになる可能性があります。
LOB 以外のタイプ、または LOB に基づく特殊タイプに対して AS LOCATOR を指定すると、 エラーが発生します (SQLSTATE 42601)。
関数が FENCED の場合や、LANGUAGE が SQL の場合、AS LOCATOR 文節は指定できません (SQLSTATE 42613)。
specific-name は、既存の method-name と同じでも構いません。
修飾子を指定しない場合、type-name に使用された修飾子が使用されます。 修飾子を指定する場合は、 type-name の明示または暗黙の修飾子と同じでなければなりません。 さもないと、エラーになります (SQLSTATE 42882)。
specific-name の指定がない場合、 固有の名前がデータベース・マネージャーによって生成されます。 生成される固有名は、SQL の後に文字のタイム・スタンプが続く名前です (SQLyymmddhhmmssxxx)。
値 NULL CALL は、 ファミリーの互換性用の CALLED ON NULL INPUT の同義語として使うことができます。
LANGUAGE OLE は、Windows 32 ビット オペレーティング・システムで保管されたユーザー定義メソッドに対してのみサポートされます。
DB2GENERAL の同義語として値 DB2GENRL が使用可能です。
パラメーターの受け渡しの詳細については、アプリケーション開発の手引き を参照してください。
NOT DETERMINISTIC メソッドの例として、 ある部署の社員の通し番号をランダムに戻すメソッドが挙げられます。 DETERMINISTIC メソッドの例として、多角形の面積を計算するメソッドが挙げられます。
メソッドが 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 を指定すると、 ヌル値の引き数の数に関係なくメソッドが呼び出されます。 これは、ヌル値を戻す場合も、通常の (ヌル値以外の) 値を戻す場合もあります。 ただし、ヌルの引き数値の有無のテストはメソッドが行う必要があります。
値 NULL CALL は、上位互換またはファミリーの互換性のために、 CALLED ON NULL INPUT の同義語として使うことができます。 同様に、NOT NULL CALL は、RETURNS NULL ON NULL INPUT の同義語として使えます。
次の 2 通りの場合、この指定は無視されます。
SCRATCHPAD を指定すると、ユーザー定義メソッドの最初の呼び出し時に、 その外部メソッドによって使用されるスクラッチパッドにメモリーが割り振られます。 このスクラッチパッドには、次の特性があります。
したがって、次のステートメントのメソッド 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 を指定すると、外部メソッドに対してスクラッチパッドは割り振られず、渡されません。
FINAL CALL を指定すると、実行時に、 呼び出しのタイプを指定する外部メソッドに追加の引き数が渡されます。 呼び出しのタイプは次のとおりです。
WITH HOLD として定義されたカーソルがオープンされている間に、 コミット操作が発生すると、それ以降のカーソルのクローズ時、 またはアプリケーションの終了時に最終呼び出しが行われます。
NO FINAL CALL を指定すると、「呼び出しタイプ」の引き数は外部メソッドに渡されず、 最終呼び出しは行われません。
メソッドにどちらのキーワードが当てはまるかを判別するには、 以下の点を検討する必要があります。
いずれの場合も、すべての外部メソッドの本体は、 データベースのすべての区分で使用可能なディレクトリーにある必要があります。
構文図は、デフォルト値が ALLOW PARALLEL であることを示しています。 しかし、ステートメントで以下のオプションの少なくとも 1 つが指定されている場合は、 デフォルトは DISALLOW PARALLEL です。
DBINFO を指定すると、以下の情報をもつ構造がメソッドに渡されます。
構造の詳細、および構造がメソッドにどのように渡されるかについては、 アプリケーション開発の手引きを参照してください。
注
どのメソッドも、別のメソッドをオーバーライドしたり、 別のメソッドによってオーバーライドされたりしてはなりません (SQLSTATE 42745)。 さらに、関数とメソッドは、オーバーライド関係にあってはなりません。 つまり、関数は、サブジェクト S を第 1 パラメーターとしてもつメソッドであった場合、 S のスーパータイプの別のメソッドをオーバーライドしてはならず、 S のスーパータイプの別のメソッドによってオーバーライドされてはならないという意味です。
REF(type-name) という参照タイプでは、 =、<>、<、<=、>、>= という名前の 6 つの比較関数が生成されます。 これらの関数はそれぞれ REF(type-name) というタイプのパラメーターを 2 つ受け取ってから、真、偽、または不明という値を戻します。 REF(type-name) の比較演算子は、 REF(type-name) の基礎データ・タイプと同じ動作をするように定義されます。 85
参照タイプの効力範囲は比較の対象にはなりません。
生成された参照タイプである REF(type-name) と この参照タイプの基礎データ・タイプとの間をキャストするために 2 つの cast 関数が生成されます。
この関数の形式は以下のとおりです。
CREATE FUNCTION funcname1 (rep-type) RETURNS REF(type-name) ...
この関数の形式は以下のとおりです。
CREATE FUNCTION funcname2 ( REF(type-name) ) RETURNS rep-type ...
ある種の rep-type には、 定数からのキャストを操作する funcname1 を使って生成された追加の cast 関数があります。
CREATE FUNCTION funcname1 (INTEGER) RETURNS REF(type-name)
CREATE FUNCTION funcname1 ( VARCHAR(n)) RETURNS REF(type-name)
CREATE FUNCTION funcname1 (VARGRAPHIC(n)) RETURNS REF(type-name)
それらの演算子や cast 関数を SQL ステートメントで正しく使用するには、 SQL パスに構造タイプのスキーマ名が組み込まれていなければなりません (SET PATH、 またはアプリケーション開発の手引き で説明されている FUNCPATH BIND オプションを参照してください)。
コンストラクター関数は、 そのタイプの新しいインスタンスを構成可能にするために生成されます。 この新しいインスタンスでは、スーパータイプから継承する属性も含め、 そのタイプのどの属性もヌルになります。
生成されるコンストラクター関数の形式は、以下のとおりです。
CREATE FUNCTION type-name ( ) RETURNS type-name ...
NOT INSTANTIABLE を指定すると、コンストラクター関数は生成されません。 構造タイプがタイプ DATALINK の属性をもっていると、 コンストラクター機能の呼び出しは失敗します (SQLSTATE 428ED)。
構造タイプの各属性ごとにオブザーバー・メソッドが定義されます。 オブザーバー・メソッドは、各属性ごとに属性タイプを戻します。 対象がヌルの場合、オブザーバー・メソッドは、属性タイプのヌル値を戻します。
たとえば、C1..STREET、C1..CITY、C1..COUNTRY、 および C1..CODE を使って、 構造タイプ ADDRESS のインスタンスの属性を監視することができます。
生成されるオブザーバー・メソッドのメソッド・シグニチャーは、 次のようなステートメントが実行された場合に似ています。
CREATE TYPE type-name ... METHOD attribute-name() RETURNS attribute-type
type-name は、構造タイプ名です。
構造タイプの各属性ごとに、タイプ保存のミューテーター・メソッドが定義されます。 構造タイプのインスタンス内の属性を変更するには、ミューテーター・メソッドを使います。 ミューテーター・メソッドは、各属性ごとに、 サブジェクトのコピーの指定属性に引き数を割り当てることで変更されたそのコピーを戻します。
たとえば、C1..CODE('M3C1H7') を使って、 構造タイプ ADDRESS のインスタンスをミュート (消音) することができます。 サブジェクトがヌルの場合、ミューテーター・メソッドはエラーを生じます (SQLSTATE 2202D)。
生成されるミュテーター・メソッドのメソッド・シグニチャーは、 次のようなステートメントが実行された場合に似ています。
CREATE TYPE type-name ... METHOD attribute-name (attribute-type) RETURNS type-name
属性のデータ・タイプが SMALLINT、REAL、CHAR、または GRAPHIC である場合、 定数を使用するミューテーション (消音) をサポートするため、 次のような追加のミューテーター・メソッドが生成されます。
例
例 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