CREATE TYPE (特殊) ステートメント

CREATE TYPE (特殊) ステートメントは、特殊タイプを定義します。 特殊タイプは、常に組み込みデータ・タイプのいずれかに基づいています。また、厳密な型規則を使用するか、緩やかな型規則を使用するかを定義できます。

厳密に型付けされた特殊タイプを定義するステートメントが正常に実行されると、特殊タイプとそのソース・タイプの間でキャストする関数も生成され、オプションで、特殊タイプで使用する比較演算子 (=、<>、<、< =、>、および> =) のサポートが生成されます。 緩やかに型付けされた特殊タイプを定義するステートメントの正常な実行によっては、関数は生成されません。

呼び出し

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

許可

このステートメントの許可 ID には、以下の権限が少なくとも 1 つ含まれている必要があります。
  • データベースに対する IMPLICIT_SCHEMA 権限 (特殊タイプのスキーマ名が既存のスキーマを指していない場合)
  • スキーマに対する CREATEIN 特権 (特殊タイプのスキーマ名が既存のスキーマを指している場合)
  • スキーマに対する SCHEMAADM 権限 (特殊タイプのスキーマ名が既存のスキーマを指している場合)
  • DBADM 権限

構文

Read syntax diagramSkip visual syntax diagramCREATE TYPEdistinct-type-nameAS source-data-type WITH STRONG TYPE RULESWITH WEAK TYPE RULESdata-type-constraints
source-data-type
Read syntax diagramSkip visual syntax diagrambuilt-in-typeanchored-data-type
built-in-type
Read syntax diagramSkip visual syntax diagramSMALLINTINTEGERINTBIGINTDECIMALDECNUMERICNUM(5,0)( integer,0, integer)FLOAT(53)( integer)REALDOUBLEPRECISIONDECFLOAT(34)(16)CHARACTERCHAR(1 BYTE)( integerOCTETSCODEUNITS32)VARCHARCHARACTERCHARVARYING( integerOCTETSCODEUNITS32)FOR BIT DATA1CLOBCHARACTERCHARLARGE OBJECT(1M)( integerKMGOCTETSCODEUNITS32)GRAPHIC(1)( integerCODEUNITS16CODEUNITS32)VARGRAPHIC( integerCODEUNITS16CODEUNITS32)DBCLOB(1M)( integerKMGCODEUNITS16CODEUNITS32)NCHARNATIONALCHARCHARACTER(1)( integer)NVARCHARNCHAR VARYINGNATIONALCHARCHARACTERVARYING( integer)NCLOBNCHAR LARGE OBJECTNATIONAL CHARACTER LARGE OBJECT(1M)( integerKMG)BINARY(1)( integer)VARBINARYBINARY VARYING(integer)BLOBBINARY LARGE OBJECT(1M)( integerKMG)DATETIMETIMESTAMP(6)(integer)BOOLEAN
anchored-data-type
Read syntax diagramSkip visual syntax diagramANCHORDATA TYPE TO variable-nametable-name.column-name
data-type-constraints
Read syntax diagramSkip visual syntax diagramNOT NULLCHECK(check-condition)
Notes:
  • 1 The FOR BIT DATA clause can be specified in any order with the other column constraints that follow. The FOR BIT DATA clause cannot be specified with string units CODEUNITS32 (SQLSTATE 42613).

説明

特殊タイプ名 (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
特殊タイプの内部表示のベースとして使用されるデータ・タイプを指定します。 データ・タイプは、組み込みデータ・タイプでなければなりません。 組み込みデータ・タイプについて詳しくは、 CREAT TABLEを参照してください。 ソース・データ・タイプをタイプ XML または ARRAY タイプにすることはできません (SQLSTATE 42601)。 プラットフォーム間でアプリケーションの移植性を確保するために、以下のデータ・タイプ名を使用することをお勧めします。
  • FLOAT ではなく DOUBLE または REAL
  • NUMERIC ではなく DECIMAL
  • LONG VARCHAR ではなく VARCHAR、BLOB、または CLOB
  • LONG VARGRAPHIC ではなく VARGRAPHIC または DBCLOB
アンカー・データ・タイプ
データ・タイプを決定するために使用される別のオブジェクトを指定します。 アンカー・オブジェクトの データ・タイプには、データ・タイプを直接的に指定する際に適用されるのと同じ制限が課せられます。
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-conditionsearch-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)
    
       CREATE TYPE T_MILES AS DOUBLE
         
    上記の指定により、次の関数が生成されます。
       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 関数
    ソース・タイプ名 関数名 パラメーター (Parameter) 戻りのタイプ
    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)ここで >24 特殊タイプ名 (distinct-type-name) DOUBLE 特殊タイプ名 (distinct-type-name)
    FLOAT (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) (VARCHAR (n)) 特殊タイプ名 (distinct-type-name)
    VARCHAR 特殊タイプ名 (distinct-type-name) VARCHAR (n) (VARCHAR (n)) 特殊タイプ名 (distinct-type-name)
    VARCHAR VARCHAR 特殊タイプ名 (distinct-type-name) VARCHAR (n) (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) (BINARY (n)) 特殊タイプ名 (distinct-type-name)
    BINARY BINARY 特殊タイプ名 (distinct-type-name) BINARY (n) (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)
    日数 特殊タイプ名 (distinct-type-name) 日数 特殊タイプ名 (distinct-type-name)
    日数 日数 特殊タイプ名 (distinct-type-name) 日数
    時刻 特殊タイプ名 (distinct-type-name) 時刻 特殊タイプ名 (distinct-type-name)
    時刻 時刻 特殊タイプ名 (distinct-type-name) 時刻
    TIMESTAMP 特殊タイプ名 (distinct-type-name) タイム・スタンプ (p 特殊タイプ名 (distinct-type-name)
    TIMESTAMP TIMESTAMP 特殊タイプ名 (distinct-type-name) タイム・スタンプ (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 オプションを参照してください。

  • 緩やかに型付けされた特殊タイプが作成される場合、追加の関数を生成または作成する必要はありません。緩やかな型規則では、ソース・タイプを使用できる同じコンテキストで、緩やかに型付けされた特殊タイプを使用することが許可されているためです。
  • 代替構文: Db2® の以前のバージョンおよび他のデータベース製品との互換性のために、以下の代替の構文がサポートされています。 これらの代替は非標準であり、使用すべきではありません。
    • CREATE TYPE の代わりに CREATE DISTINCT TYPE を指定できます。
    • LONG VARCHAR と LONG VARGRAPHIC データ・タイプ、および cast 関数は、サポートされていますが推奨されておらず、将来のリリースでは除去される可能性があります。 WITH COMPARISONS 節は、引き続き LONG VARCHAR および LONG VARGRAPHIC データ・タイプをサポートしません。
    • WITH WEAK TYPE RULES を指定しない場合、WITH COMPARISONS 節 (特殊タイプの 2 つのインスタンスを比較するためにシステム生成の比較演算子を作成することを指定します) をステートメントの最後の節として指定できます。 WITH COMPARISON は、 Db2 ファミリーの前のバージョンの製品との互換性のために必要な場合にのみ使用してください。 ソース・データ・タイプが BLOB、CLOB、または DBCLOB の場合に WITH COMPARISONS を指定すると、前のリリースと同様に警告が出されます。
    • NOT NULL の逆として、ALLOW NULL または単に NULL を指定できます。 これは、ALLOW NULL 節も NOT NULL 節も指定しない場合に、特殊タイプのデフォルトとなる NULL 可能性特性です。 ALLOW NULL を指定することは、特殊タイプのデータ・タイプ制約を定義することとは見なされません。

  • 例 1: INTEGER データ・タイプに基づく、SHOESIZE という名前の厳密に型付けされた特殊タイプを作成します。
       CREATE TYPE SHOESIZE AS INTEGER

    これにより、比較演算子 (=、<>、<、< =、>、>、> =) およびキャスト関数 INTEGER (SHOESIZE) が作成され、SHOESIZE を戻す INTEGER および SHOESIZE (INTEGER) が戻されます。

  • 例 2: DOUBLE データ・タイプに基づく、MILES という名前の厳密に型付けされた特殊タイプを作成します。
       CREATE TYPE MILES AS DOUBLE

    これにより、比較演算子 (=、<>、<、=、>、>、> =) が作成され、cast 関数 DOUBLE (マイル) が DOUBLE を戻し、CAST (マイル (DOUBLE) が MILES を戻します。

  • 例 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)