CREATE TYPE (特殊)
CREATE TYPE (特殊) ステートメントは、現行サーバー上に特殊タイプを定義します。特殊タイプは、常に組み込みデータ・タイプの 1 つをソースとして作成 されます。
ステートメントの実行が正常に完了すると、以下のものも生成されます:
- 特殊タイプからそのソース・タイプにキャストする 1 つの関数
- ソース・タイプからその特殊タイプにキャストする 1 つの関数
- 該当する場合、特殊タイプを持つ比較演算子の使用をサポートします。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込むことができ、また対話式に呼び出すこともできます。 これは、動的に準備できる実行可能ステートメントです。
権限
このステートメントの権限 ID が保持する特権には、少なくとも以下の 1 つ が含まれていなければなりません。
- スキーマ内に作成する特権。詳しくは、スキーマ内で作成する必要のある権限を参照してください。
- データベース管理者権限
このステートメントの権限 ID が保持する特権には、少なくとも以下の 1 つ が含まれていなければなりません。
- SYSTYPES カタログ表の場合
- 該当の表に対する INSERT 特権、および
- QSYS2 ライブラリーに対する *EXECUTE システム権限
- データベース管理者権限
SQL 名が指定され、特殊タイプが作成されるライブラリーと同じ名前のユーザー・プロファイルが存在し、しかも、その名前がステートメントの権限 ID と異なっている場合、ステートメントの権限 ID が保持している特権には、少なくとも次のいずれか 1 つを含める必要があります。
- その名前を持つユーザー・プロファイルに対する *ADD システム権限
- データベース管理者権限
SQL 特権に対応するシステム権限については『表またはビューへの権限を検査する際の対応するシステム権限』を参照してください。
built-in-type |--+-+---SMALLINT---+----------------------------------------------------------------------------------------------------------+--| | +-+-INTEGER-+--+ | | | '-INT-----' | | | '---BIGINT-----' | | .-(5,0)------------------------. | +-+-+-DECIMAL-+-+--+------------------------------+-------------------------------------------------------------------------+ | | '-DEC-----' | | .-,0--------. | | | '-+-NUMERIC-+-' '-(--integer--+-----------+--)-' | | '-NUM-----' '-, integer-' | | .-(--53--)------. | +-+-FLOAT--+---------------+-+----------------------------------------------------------------------------------------------+ | | '-(--integer--)-' | | | +-REAL---------------------+ | | | .-PRECISION-. | | | '-DOUBLE--+-----------+----' | | .-(--34--)-. | +---DECFLOAT--+----------+--------------------------------------------------------------------------------------------------+ | '-(--16--)-' | | .-(--1--)-------. | +-+-+-+-CHARACTER-+--+---------------+-------------------------------+--+----------------+---------------------+------------+ | | | '-CHAR------' '-(--integer--)-' | +-FOR BIT DATA---+ | | | | '-+-+-CHARACTER-+--VARYING-+--(--integer--)--+-----------------+-' +-FOR SBCS DATA--+ | | | | | '-CHAR------' | '-allocate-clause-' +-FOR MIXED DATA-+ | | | | '-VARCHAR----------------' '-ccsid-clause---' | | | | .-(--1M--)-------------. | | | '-----+-+-CHARACTER-+--LARGE OBJECT-+------+----------------------+--+-----------------+--+----------------+-' | | | '-CHAR------' | '-(--integer--+---+--)-' '-allocate-clause-' +-FOR SBCS DATA--+ | | '-CLOB------------------------' +-K-+ +-FOR MIXED DATA-+ | | +-M-+ '-ccsid-clause---' | | '-G-' | | .-(--1--)-------. | +-+---GRAPHIC----+---------------+----------------------------+--+--------------+-------------------------------------------+ | | '-(--integer--)-' | '-ccsid-clause-' | | +-+-GRAPHIC VARYING-+--(--integer--)--+-----------------+---+ | | | '-VARGRAPHIC------' '-allocate-clause-' | | | | .-(--1M--)-------------. | | | '---DBCLOB----+----------------------+--+-----------------+-' | | '-(--integer--+---+--)-' '-allocate-clause-' | | +-K-+ | | +-M-+ | | '-G-' | | .-(--1--)-------. | +-+-+-+-NATIONAL CHARACTER-+--+---------------+-------------------------------+---------------------+--+------------------+-+ | | | +-NATIONAL CHAR------+ '-(--integer--)-' | | '-normalize-clause-' | | | | '-NCHAR--------------' | | | | | '-+-+-NATIONAL CHARACTER-+--VARYING-+--(--integer--)--+-----------------+-' | | | | | +-NATIONAL CHAR------+ | '-allocate-clause-' | | | | | '-NCHAR--------------' | | | | | '-NVARCHAR------------------------' | | | | .-(--1M--)-------------. | | | '-----+-+-NATIONAL CHARACTER-+--LARGE OBJECT-+------+----------------------+--+-----------------+-' | | | '-NCHAR--------------' | '-(--integer--+---+--)-' '-allocate-clause-' | | '-NCLOB--------------------------------' +-K-+ | | +-M-+ | | '-G-' | | .-(--1--)-------. | +-+-+-BINARY--+---------------+------------------------------+-----------------+--------------------------------------------+ | | | '-(--integer--)-' | | | | | '-+-BINARY VARYING-+--(--integer--)--+-----------------+-' | | | | '-VARBINARY------' '-allocate-clause-' | | | | .-(--1M--)-------------. | | | '---+-BLOB----------------+----+----------------------+--+-----------------+-' | | '-BINARY LARGE OBJECT-' '-(--integer--+---+--)-' '-allocate-clause-' | | +-K-+ | | +-M-+ | | '-G-' | +-+-DATE-------------------------+------------------------------------------------------------------------------------------+ | | .-(--0--)-. | | | +-TIME--+---------+------------+ | | | .-(--6--)-------. | | | '-TIMESTAMP--+---------------+-' | | '-(--integer--)-' | | .-(--200--)-----. | +---DATALINK--+---------------+--+-----------------+--+--------------+------------------------------------------------------+ | '-(--integer--)-' '-allocate-clause-' '-ccsid-clause-' | +---ROWID-------------------------------------------------------------------------------------------------------------------+ '---XML--+-----------------+--+--------------+------------------------------------------------------------------------------' '-allocate-clause-' '-ccsid-clause-' ccsid-clause |--CCSID--integer--+------------------+-------------------------| '-normalize-clause-' normalize-clause .-NOT NORMALIZED-. |--+-NORMALIZED-----+-------------------------------------------|
説明
- distinct-type-name
- 特殊タイプを指定します。暗黙的または明示的修飾子も含め、この名前は、現行サーバーに既に存在している特殊タイプまたは配列タイプと同じ名前にすることはできません。
SQL 名が指定されている場合、特殊タイプは、暗黙的または明示的修飾子で 指定しているスキーマ内に作成されます。
システム名が指定されている場合、特殊タイプは、修飾子で指定している スキーマ内に作成されます。 修飾されない場合:
- CURRENT SCHEMA 特殊レジスターの値が *LIBL である場合、特殊タイプは、現行ライブラリー (*CURLIB) 内に作成されます。
- そうでない場合、特殊タイプは現行スキーマ内に作成されます。
特殊タイプが有効なシステム名でない場合、DB2® for i は、システム名を生成します。 名前の生成に関する規則については、表名の生成の規則を参照してください。
特殊タイプ名 は、組み込みデータ・タイプの名前 にすることはできません。また、下記のシステム予約のどのキーワードにす ることもできません。これは、それらのキーワードを区切り文字付き ID として指定している場合にも該当します。= < > >= <= <> ¬= ¬< ¬< != !< !> ALL FALSE POSITION XMLAGG AND FOR RID XMLATTRIBUTES ANY FROM RRN XMLCOMMENT ARRAY_AGG HASHED_VALUE SELECT XMLCONCAT BETWEEN IN SIMILAR XMLDOCUMENT BOOLEAN INTERVAL SOME XMLELEMENT CASE IS STRIP XMLFOREST CAST LIKE SUBSTRING XMLGROUP CHECK MATCH TABLE XMLNAMESPACES DATAPARTITIONNAME NODENAME THEN XMLPARSE DATAPARTITIONNUM NODENUMBER TRIM XMLPI DBPARTITIONNAME NOT TRUE XMLROW DBPARTITIONNUM NULL TYPE XMLSERIALIZE DISTINCT ONLY UNIQUE XMLTEXT EXCEPT OR UNKNOWN XMLVALIDATE EXISTS OVERLAPS WHEN XSLTRANSFORM EXTRACT PARTITION 修飾付きの特殊タイプ名 を指定した場合は、スキーマ名は QSYS、QSYS2、 QTEMP、または SYSIBM であってはなりません。
- built-in-type
- 特殊タイプの内部表示のベースとして使用される組み込みデータ・タイプを指定します。
それぞれの組み込みデータの詳細については、CREATE TABLEを参照してください。
プラットフォーム間でのアプリケーションの移植性を保つには、 推奨される次のデータ・タイプ名を使用します。
- FLOAT の代わりに DOUBLE または REAL。
- NUMERIC の代わりに DECIMAL。
長さ、精度、位取りの属性があるデータ・タイプで特定の値が指定されていない場合は、構文図で示されているデフォルト属性がそのデータ・タイプで暗黙指定されます。
特殊タイプのソースがストリング・データ・タイプの場合、CCSID は、そ の特殊タイプの作成時の特殊データ・タイプに関連しています。データ・タイプの詳細については、CREATE TABLE を参照してくだ さい。
注
追加の生成関数: 上記のシステム生成比較演算子のほかに、ソース・タイプの変換のために以下の関数を使用できるようになります。
- 特殊タイプからソース・タイプへ
- ソース・タイプから特殊タイプへ
- INTEGER から特殊タイプへ (ソース・タイプが SMALLINT の場合)
- DOUBLE から特殊タイプへ (ソース・タイプが REAL の場合)
- VARCHAR から特殊タイプへ (ソース・タイプが CHAR の場合)
- VARGRAPHIC から特殊タイプへ (ソース・タイプが GRAPHIC の場合)
これらの関数は、次のステートメントを実行した場合と同様に作成されます (ただし、サービス・プログラムは作成されないので、これらの関数に対する特権を認可したり取り消したりすることはできません)。
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 という名前の特殊タイプが、次のステートメントを使用して作成されると仮定します。
CREATE TYPE CLAIRE.T_SHOESIZE AS VARCHAR(2) WITH COMPARISONS
このステートメントが実行されると、データベース・マネージャーは、次のキャスト関数も生成 します。 VARCHAR は、特殊タイプからソース・タイプに変換し、T_SHOESIZE は、ソース・タイプから特殊タイプに変換します。
FUNCTION CLAIRE.VARCHAR (CLAIRE.T_SHOESIZE) RETURNS VARCHAR(2)
FUNCTION CLAIRE.T_SHOESIZE (VARCHAR(2) RETURNS CLAIRE.T_SHOESIZE
関数 VARCHAR は、データ・タイプ VARCHAR(2) と一緒に値を戻し、関数 T_SHOESIZE には、データ・タイプ VARCHAR(2) と一緒に入力パラメーターが指定されます。
生成されたキャスト関数を明示的に除去することはできません。特殊タイプに対して生成されるキャスト関数は、その特殊タイプが DROP ステートメントで除去される時点で暗黙に除去されます。
次の表は、特殊タイプに対してソース・データ・タイプにすることができる組み込みデータ・タイプごとに、生成されたキャスト関数の名前、入力パラメーターのデータ・タイプ、およびそれらの関数が戻す値のデータ・タイプを示します。
ソース・タイプ名 | 関数名 | パラメーター・タイプ | 戻りタイプ |
---|---|---|---|
SMALLINT | distinct-type-name | SMALLINT | distinct-type-name |
distinct-type-name | INTEGER | distinct-type-name | |
SMALLINT | distinct-type-name | SMALLINT | |
INTEGER | distinct-type-name | INTEGER | distinct-type-name |
INTEGER | distinct-type-name | INTEGER | |
BIGINT | distinct-type-name | BIGINT | distinct-type-name |
BIGINT | distinct-type-name | BIGINT | |
DECIMAL | distinct-type-name | DECIMAL(p,s) | distinct-type-name |
DECIMAL | distinct-type-name | DECIMAL(p,s) | |
NUMERIC | distinct-type-name | NUMERIC(p,s) | distinct-type-name |
NUMERIC | distinct-type-name | NUMERIC(p,s) | |
REAL または FLOAT(n) (ここで、n <= 24) | distinct-type-name | REAL | distinct-type-name |
distinct-type-name | DOUBLE | distinct-type-name | |
REAL | distinct-type-name | REAL | |
DOUBLE または DOUBLE PRECISION または FLOAT(n) ここで、 n > 24 | distinct-type-name | DOUBLE | distinct-type-name |
DOUBLE | distinct-type-name | DOUBLE | |
DECFLOAT | distinct-type-name | DECFLOAT(n) | distinct-type-name |
DECFLOAT | distinct-type-name | DECFLOAT(n) | |
CHAR | distinct-type-name | CHAR(n) | distinct-type-name |
CHAR | distinct-type-name | CHAR(n) | |
distinct-type-name | VARCHAR(n) | distinct-type-name | |
VARCHAR | distinct-type-name | VARCHAR(n) | distinct-type-name |
VARCHAR | distinct-type-name | VARCHAR(n) | |
CLOB | distinct-type-name | CLOB(n) | distinct-type-name |
CLOB | distinct-type-name | CLOB(n) | |
GRAPHIC | distinct-type-name | GRAPHIC (n) | distinct-type-name |
GRAPHIC | distinct-type-name | GRAPHIC (n) | |
distinct-type-name | VARGRAPHIC (n) | distinct-type-name | |
VARGRAPHIC | distinct-type-name | VARGRAPHIC (n) | distinct-type-name |
VARGRAPHIC | distinct-type-name | VARGRAPHIC (n) | |
DBCLOB | distinct-type-name | DBCLOB(n) | distinct-type-name |
DBCLOB | distinct-type-name | DBCLOB(n) | |
BINARY | distinct-type-name | BINARY(n) | distinct-type-name |
BINARY | distinct-type-name | BINARY(n) | |
distinct-type-name | VARBINARY(n) | distinct-type-name | |
VARBINARY | distinct-type-name | VARBINARY(n) | distinct-type-name |
VARBINARY | distinct-type-name | VARBINARY(n) | |
BLOB | distinct-type-name | BLOB(n) | distinct-type-name |
BLOB | distinct-type-name | BLOB(n) | |
DATE | distinct-type-name | DATE | distinct-type-name |
DATE | distinct-type-name | DATE | |
TIME | distinct-type-name | TIME | distinct-type-name |
TIME | distinct-type-name | TIME | |
TIMESTAMP | distinct-type-name | TIMESTAMP(p) | distinct-type-name |
TIMESTAMP | distinct-type-name | TIMESTAMP(p) | |
DATALINK | distinct-type-name | DATALINK | distinct-type-name |
DATALINK | distinct-type-name | DATALINK | |
ROWID | distinct-type-name | ROWID | distinct-type-name |
ROWID | distinct-type-name | ROWID |
可搬性のあるアプリケーションに対して特殊タイプを作成する場合、NUMERIC と FLOAT はお勧めできません。 それらの代わりに、DECIMAL と DOUBLE を使用するようにしてください。
組み込み関数: 上の表で説明されている関数は、 特殊タイプの定義時に自動的に生成される関数のみです。 このため、特殊タイプで自動的にサポートされる組み込み関数 (AVG、MAX、LENGTH など) はありません。 組み込み関数を特殊タイプで使用できるのは、 組み込み関数に基づくソース化されたユーザー定義関数が特殊タイプに対して作成された後だけです。 組み込み関数の拡張またはオーバーライド:を参照してください。
これらの演算子やキャスト関数を SQL ステートメントで正しく使用するには、特殊タイプに特殊タイプのスキーマ名が組み込まれている必要があります。
特殊タイプの属性 : 特殊タイプ は *SQLUDT オブジェクトとして作成されます。
特殊タイプの所有権: SQL 名が指定されている場合、
- 作成した特殊タイプが入れられるスキーマと同じ名前のユーザー・プロファイルが存在する場合、特殊タイプの所有者 はそのユーザー・プロファイルです。
- その他の場合は、特殊タイプの所有者 は、この ステートメントを実行しているスレッドのユーザー・プロファイルまたは グループ・ユーザー・プロファイルです。
システム名を指定した場合は、特殊タイプの所有者 は、この ステートメントを実行しているスレッドのユーザー・プロファイルまたはグループ・ユーザー・プロファイルです。
特殊タイプの権限 : SQL 名を使用する場合は、特殊タイプは、*PUBLIC に対するシステム権限 *EXCLUDE を使用して作成されます。システム名を使用する場合、特殊タイプは、スキーマの作成権限 (CRTAUT) パラメ ーターによって決められる *PUBLIC に対する権限を使用して作成されます。
特殊タイプの所有者がグループ・プロファイルのメンバー (GRPPRF キーワード) であり、グループ権限が指定されている (GRPAUT キーワード) 場合は、そのグループ・プロファイルにも、その特殊タイプに対する権限が与えられます。
代替構文: WITH COMPARISONS 文節は、特殊タイプの 2 つのインスタンスを比較するためにシステム生成の比較演算子を作成する ように指定します。この文節は、ステートメントの最後の文節として指定できます。WITH COMPARISONS は 、DB2 ファミリーの他製品との互換性を保つために必要な場合に限って使用してください。
- CREATE TYPE の代わりに CREATE DISTINCT TYPE を指定できます。
例
例 1: 組み込み INTEGER データ・タイプをソースとする SHOESIZE という名前の 特殊タイプを作成します。
CREATE TYPE SHOESIZE AS INTEGER WITH COMPARISONS
このステートメントの実行が正常に完了すると、2 つのキャスト関数も生成されます。関数 INTEGER(SHOESIZE) は、データ・タイプ INTEGER が指定された値を戻し、関数 SHOESIZE(INTEGER) は、特殊タイプ SHOESIZE が指定された値を戻します。
例 2: 組み込み DOUBLE データ・タイプをソースとする MILES という名前の特殊タイプ を作成します。
CREATE TYPE MILES
AS DOUBLE WITH COMPARISONS
このステートメントの実行が正常に完了すると、2 つのキャスト関数も生成されます。関数 DOUBLE(MILES) は、データ・タイプ DOUBLE が指定された値を戻し、関数 MILES(DOUBLE) は、特殊タイプ MILES が指定された値を戻します。
例 3: 組み込み CHAR データ・タイプをソースとする特殊タイプ T_DEPARTMENT を作成します。
CREATE TYPE CLAIRE.T_DEPARTMENT AS CHAR(3)
WITH COMPARISONS
このステートメントの実行が正常に完了すると、次の 3 つのキャスト関数も生成されます:
- 関数 CLAIRE.CHAR は T_DEPARTMENT を入力として取り、 データ・タイプ CHAR(3) を持つ値を戻します。
- 関数 CLAIRE.T_DEPARTMENT は CHAR(3) を入力として取り、 特殊タイプ T_DEPARTMENT を持つ値を戻します。
- 関数 CLAIRE.T_DEPARTMENT は VARCHAR(3) を入力として取り、 特殊タイプ T_DEPARTMENT を持つ値を戻します。