CREATE TYPE (特殊) ステートメント
CREATE TYPE (特殊) ステートメントは、特殊タイプを定義します。特殊タイプは、常に組み込みデータ・タイプのいずれかに基づいています。また、厳密な型規則を使用するか、緩やかな型規則を使用するかを定義できます。
厳密に型付けされた特殊タイプを定義するステートメントの正常な実行により、特殊タイプとそのソース・タイプとの間でキャストする関数も生成され、またオプションでその特殊タイプで使用する比較演算子 (=、<>、<、<=、>、および >=) に対するサポートが生成されます。緩やかに型付けされた特殊タイプを定義するステートメントの正常な実行によっては、関数は生成されません。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込んだり、動的 SQL ステートメントを使用して発行したりすることができます。 これは、DYNAMICRULES の実行動作がパッケージに効力を持つ場合にのみ、動的に準備できる実行可能ステートメントです (SQLSTATE 42509)。
許可
- データベースに対する IMPLICIT_SCHEMA 権限 (特殊タイプのスキーマ名が既存のスキーマを指していない場合)
- スキーマに対する CREATEIN 特権 (特殊タイプのスキーマ名が既存のスキーマを指している場合)
- スキーマに対する SCHEMAADM 権限 (特殊タイプのスキーマ名が既存のスキーマを指している場合)
- DBADM 権限
構文
説明
- distinct-type-name
- 特殊タイプの名前を指定します。
名前 (暗黙または明示の修飾子を含む) は、現行サーバーに既に存在するその他のタイプ (組み込みタイプまたはユーザー定義タイプ) と同じであってはなりません。
非修飾名は、組み込みデータ・タイプと同じ名前にすることはできず (SQLSTATE 42918)、ARRAY、INTERVAL、ROWID のいずれかにすることもできません。
動的 SQL ステートメントでは、CURRENT SCHEMA 特殊レジスターが、 修飾子のないオブジェクト名の修飾子として使用されます。 静的 SQL ステートメントでは、QUALIFIER プリコンパイル/BIND オプションにより、 修飾子のないオブジェクト名の修飾子が暗黙指定されます。 修飾形式は、スキーマ名の後にピリオドと SQL ID が続きます。
述部のキーワードとして使用されるいくつかの名前はシステム使用に予約されており、特殊タイプ名として使用することはできません (SQLSTATE 42939)。 それらの名前は、SOME、ANY、ALL、NOT、AND、OR、BETWEEN、NULL、LIKE、EXISTS、IN、UNIQUE、OVERLAPS、SIMILAR、MATCH および比較演算子です。
2 部構成の名前を指定する場合、文字 SYS で始まるスキーマ名は使用できません (SQLSTATE 42939)。
- source-data-type
- 特殊タイプの内部表示のベースとして使用されるデータ・タイプを指定します。
データ・タイプは、組み込みデータ・タイプでなければなりません。
組み込みデータ・タイプの詳細については、『CREATE TABLE』を参照してください。ソース・データ・タイプをタイプ XML または ARRAY タイプにすることはできません (SQLSTATE 42601)。プラットフォーム間でアプリケーションの移植性を確保するために、以下のデータ・タイプ名を使用することをお勧めします。
- FLOAT ではなく DOUBLE または REAL
- NUMERIC ではなく DECIMAL
- LONG VARCHAR ではなく VARCHAR、BLOB、または CLOB
- LONG VARGRAPHIC ではなく VARGRAPHIC または DBCLOB
- anchored-data-type
- データ・タイプを決定するために使用される別のオブジェクトを指定します。アンカー・オブジェクトの
データ・タイプには、データ・タイプを直接的に指定する際に適用されるのと同じ制限が課せられます。
- ANCHOR DATA TYPE TO
- アンカー・データ・タイプを使用してデータ・タイプを指定することを示します。
- variable-name
- ROW または CURSOR 以外の組み込みタイプであるデータ・タイプを持つグローバル変数を指定します。グローバル変数のデータ・タイプが、特殊タイプに対するソース・データ・タイプとして使用されます。
- table-name.column-name
- 組み込みタイプとして指定される必要のあるデータ・タイプを持つ既存の表またはビューの列名を指定します。列のデータ・タイプが、特殊タイプに対するソース・データ・タイプとして使用されます。
- WITH STRONG TYPE RULES
- 代入や比較を含め、このデータ・タイプがオペランドとなる演算に、厳密な型判定規則を使用することを指定します。これはデフォルトです。
- WITH WEAK TYPE RULES
- 代入、比較、および関数解決を含め、このデータ・タイプがオペランドとなる演算に、緩やかな型判定規則を使用することを指定します。緩やかに型付けされた特殊タイプの値が使用される場合、演算を処理するときに、データ・タイプは事実上、指定された source-data-type として処理されます。
- data-type-constraints
- 値が特殊タイプに代入またはキャストされるときに適用される、特殊タイプの制約を定義します。
- NOT NULL
- この特殊タイプを持つ値が NULL 値を持たないようにします。NOT NULL が指定されていない場合、この特殊タイプの値は NULL 値を持つことができます。
- CHECK (check-condition)
- データ・タイプ・チェック制約を定義します。check-condition は、このデータ・タイプを持つすべての値に対して、常に真または不明である必要があります。check-condition は search-condition の 1 つの形式であり、表チェック制約の規則に準拠する (SQLSTATE 426211) ことに加え、VALUE キーワードを使用することにより、特殊タイプに代入またはキャストされる値の参照を、表チェック制約で列名が参照される場合と同じ方法で行います。check-condition は、グローバル変数を参照できないことに注意してください。
- built-in-type
- 組み込みデータ・タイプの説明については、『CREATE TABLE』を参照してください。
規則
- アンカー・データ・タイプの使用: アンカー・データ・タイプは次のオブジェクトを参照できません (SQLSTATE 428HS): ニックネーム、型付き表、型付きビュー、式ベースの索引に関連付けられた統計ビュー、宣言済み一時表、緩やかに型付けされたカーソルに関連付けられた行定義、データベース・コード・ページまたはデータベース照合とは異なるコード・ページまたは照合を使用するオブジェクト。
注
- 特権: ユーザー定義タイプの定義者は、特殊タイプに関して自動的に生成されるすべての関数で、EXECUTE 特権 WITH GRANT OPTION を必ず与えられます。
CREATE TYPE (特殊) ステートメントの実行中に自動的 に生成されるすべての関数への EXECUTE 特権は、PUBLIC に与えられます。
- まだ存在していないスキーマ名を用いて特殊タイプを作成すると、 ステートメントの許可 ID に IMPLICIT_SCHEMA 権限がある場合に限り、 そのスキーマが暗黙的に作成されます。 スキーマの所有者は SYSIBM になります。スキーマに対する CREATEIN 特権が PUBLIC に付与されます。
- 追加で生成される関数: 厳密に型付けされた特殊タイプが作成されると、ソース・タイプとの間のキャストに必要な次の関数が生成されます。
- 特殊タイプをソース・タイプに変換する関数
- ソース・タイプを特殊タイプに変換する関数
- ソース・タイプが SMALLINT の場合、INTEGER から特殊タイプに変換する関数
- ソース・タイプが CHAR の場合、VARCHAR から特殊タイプに変換する関数
- ソース・タイプが BINARY の場合、VARCHAR から特殊タイプに変換する関数
- ソース・タイプが GRAPHIC の場合、VARGRAPHIC から特殊タイプに変換する関数
一般に、これらの関数の形式は次のようになります。CREATE FUNCTION source-type-name (distinct-type-name) RETURNS source-type-name ... CREATE FUNCTION distinct-type-name (source-type-name) RETURNS distinct-type-name ...ソース・タイプがパラメーター化タイプである場合、 特殊タイプをソース・タイプに変換する関数の関数名は、 パラメーターなしのソース・タイプの名前になります (詳細については、表 1 を参照)。 この関数の戻り値のタイプには、 CREATE TYPE (特殊) ステートメントに指定されたパラメーターが含められます。 ソース・タイプを特殊タイプに変換するための関数の入力パラメーターは、 そのパラメーターを含むソース・タイプになります。 以下に例を示します。CREATE TYPE T_SHOESIZE AS CHAR(2) WITH COMPARISONS CREATE TYPE T_MILES AS DOUBLE WITH COMPARISONS上記の指定により、次の関数が生成されます。FUNCTION CHAR (T_SHOESIZE) RETURNS CHAR (2) FUNCTION T_SHOESIZE (CHAR (2)) RETURNS T_SHOESIZE FUNCTION DOUBLE (T_MILES) RETURNS DOUBLE FUNCTION T_MILES (DOUBLE) RETURNS T_MILES生成された cast 関数のスキーマは、特殊タイプのスキーマと同じです。 この名前と同じ名前でシグニチャーも同じ他の関数が、 データベースに既に存在していてはなりません (SQLSTATE 42710)。
次の表は、事前定義されているすべてのデータ・タイプについて、 特殊タイプをソース・タイプに変換する関数、 およびソース・タイプを特殊タイプに変換する関数の名前を示しています。
表 1. 特殊タイプに対する CAST 関数 ソース・タイプ名 関数名 パラメーター 戻りタイプ SMALLINT distinct-type-name SMALLINT distinct-type-name SMALLINT distinct-type-name INTEGER distinct-type-name SMALLINT SMALLINT distinct-type-name SMALLINT INTEGER distinct-type-name INTEGER distinct-type-name INTEGER INTEGER distinct-type-name INTEGER BIGINT distinct-type-name BIGINT distinct-type-name BIGINT BIGINT distinct-type-name BIGINT DECIMAL distinct-type-name DECIMAL (p,s) distinct-type-name DECIMAL DECIMAL distinct-type-name DECIMAL (p,s) NUMERIC distinct-type-name DECIMAL (p,s) distinct-type-name NUMERIC DECIMAL distinct-type-name DECIMAL (p,s) REAL distinct-type-name REAL distinct-type-name REAL distinct-type-name DOUBLE distinct-type-name REAL REAL distinct-type-name REAL FLOAT(n) ただし n<=24 distinct-type-name REAL distinct-type-name FLOAT(n) ただし n<=24 distinct-type-name DOUBLE distinct-type-name FLOAT(n) ただし n<=24 REAL distinct-type-name REAL FLOAT(n) ただし n>24 distinct-type-name DOUBLE distinct-type-name FLOAT(n) ただし n>24 DOUBLE distinct-type-name DOUBLE FLOAT distinct-type-name DOUBLE distinct-type-name FLOAT DOUBLE distinct-type-name DOUBLE DOUBLE distinct-type-name DOUBLE distinct-type-name DOUBLE DOUBLE distinct-type-name DOUBLE DOUBLE PRECISION distinct-type-name DOUBLE distinct-type-name DOUBLE PRECISION DOUBLE distinct-type-name DOUBLE DECFLOAT distinct-type-name DECFLOAT(n) distinct-type-name DECFLOAT DECFLOAT distinct-type-name DECFLOAT(n) CHAR distinct-type-name CHAR (n) distinct-type-name CHAR CHAR distinct-type-name CHAR (n) CHAR distinct-type-name VARCHAR (n) distinct-type-name VARCHAR distinct-type-name VARCHAR (n) distinct-type-name VARCHAR VARCHAR distinct-type-name VARCHAR (n) CLOB distinct-type-name CLOB (n) distinct-type-name CLOB CLOB distinct-type-name CLOB (n) GRAPHIC distinct-type-name GRAPHIC (n) distinct-type-name GRAPHIC GRAPHIC distinct-type-name GRAPHIC (n) GRAPHIC distinct-type-name VARGRAPHIC (n) distinct-type-name VARGRAPHIC distinct-type-name VARGRAPHIC (n) distinct-type-name VARGRAPHIC VARGRAPHIC distinct-type-name VARGRAPHIC (n) DBCLOB distinct-type-name DBCLOB (n) distinct-type-name DBCLOB DBCLOB distinct-type-name DBCLOB (n) BINARY distinct-type-name BINARY (n) distinct-type-name BINARY BINARY distinct-type-name BINARY (n) BINARY distinct-type-name VARBINARY (n) distinct-type-name VARBINARY distinct-type-name VARBINARY (n) distinct-type-name VARBINARY VARBINARY distinct-type-name VARBINARY (n) BLOB distinct-type-name BLOB (n) distinct-type-name BLOB BLOB distinct-type-name BLOB (n) DATE distinct-type-name DATE distinct-type-name DATE DATE distinct-type-name DATE TIME distinct-type-name TIME distinct-type-name TIME TIME distinct-type-name TIME TIMESTAMP distinct-type-name TIMESTAMP(p distinct-type-name TIMESTAMP TIMESTAMP distinct-type-name TIMESTAMP(p) BOOLEAN distinct-type-name BOOLEAN distinct-type-name BOOLEAN BOOLEAN distinct-type-name BOOLEAN 注: NUMERIC および FLOAT は、 移植可能アプリケーションのユーザー定義タイプを作成する場合にはお勧めできません。 代わりに DECIMAL および DOUBLE を使用してください。特殊タイプを定義する時に自動的に生成される関数は、上記の表で説明している関数と、比較演算子関数だけです。したがって、どの組み込み関数 (AVG、MAX、LENGTH など) も、CREATE FUNCTION ステートメントを使用して厳密に型付けされた特殊タイプに対応するユーザー定義関数を登録し、それらのユーザー定義関数を適切な組み込み関数からソース派生させてからでなければ、厳密に型付けされた特殊タイプをサポートしません。特に、組み込み列関数に基づくユーザー定義関数を登録することが可能である点に注意してください。
厳密に型付けされた特殊タイプが作成されると、ソース・タイプが比較をサポートする場合に、システム生成の比較演算子が作成されます。これらの比較演算子の作成により、 SYSCAT.ROUTINES カタログ・ビューに新しい関数としての項目が生成されます。
これらの演算子や cast 関数を SQL ステートメントで正しく使用するには、 SQL パスに特殊タイプのスキーマ名が含まれていなければなりません。 または FUNCPATH BIND オプションを参照してください。
- 緩やかに型付けされた特殊タイプが作成される場合、追加の関数を生成または作成する必要はありません。緩やかな型規則では、ソース・タイプを使用できる同じコンテキストで、緩やかに型付けされた特殊タイプを使用することが許可されているためです。
例
- 例 1: INTEGER データ・タイプに基づく、SHOESIZE という名前の厳密に型付けされた特殊タイプを作成します。
CREATE TYPE SHOESIZE AS INTEGERまたこの結果、比較演算子 (=、<>、<、<=、>、>=)、 INTEGER を戻す cast 関数 INTEGER(SHOESIZE)、 および SHOESIZE を戻す cast 関数 SHOESIZE(INTEGER) が作成されます。
- 例 2: DOUBLE データ・タイプに基づく、MILES という名前の厳密に型付けされた特殊タイプを作成します。
CREATE TYPE MILES AS DOUBLEまたこの結果、比較演算子 (=、<>、<、 =、>、>=)、 DOUBLE を戻す cast 関数 DOUBLE(MILES)、 および MILES を戻す cast 関数 MILES(DOUBLE) が作成されます。
- 例 3: BONUS という名前の緩やかに型付けされた特殊タイプを作成します。この特殊タイプは、INTEGER データ・タイプに基づき、パーセンテージ (100 を超えることはできません) を表します。
CREATE TYPE BONUS AS INTEGER WITH WEAK TYPE RULES CHECK(VALUE >= 0 AND VALUE <= 100)緩やかな型規則で定義されているため、BONUS という名前の緩やかに型付けされた特殊タイプに対して、比較およびキャストの関数は生成されません。
- 例 4: SALARY という名前の緩やかに型付けされた特殊タイプを作成します。この特殊タイプは、NULL を指定できない DOUBLE データ・タイプに基づき、範囲の上限は 100000 未満に制限されます。
CREATE TYPE SALARY AS DOUBLE WITH WEAK TYPE RULES NOT NULL CHECK(VALUE < 100000)
