SQL 解説書
ALTER TYPE ステートメントは、
ユーザー定義の構造タイプの属性またはメソッド指定を追加または除去します。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込むか、
または動的 SQL ステートメントを使用して発行することができます。
このステートメントは、動的に準備可能な実行可能ステートメントです。
しかし、バインド・オプション DYNAMICRULES BIND を適用する場合、
ステートメントを動的に準備することはできません (SQLSTATE 42509)。
許可
このステートメントの許可 ID には、以下の特権が少なくとも 1 つ含まれている必要があります。
- SYSADM または DBADM 権限
- タイプのスキーマに対する ALTERIN 特権
- SYSCAT.DATATYPES の DEFINER 列に記録されているそのタイプの定義者
構文
>>-ALTER TYPE--type-name---------------------------------------->
.-,----------------------------------------------------------------------------------------.
V (1) |
>---------------+-ADD ATTRIBUTE--| attribute-definition |-------------------------------------+--+>
| .-RESTRICT-. |
+-DROP ATTRIBUTE--attribute-name-+----------+---------------------------------+
+-ADD--| method-specification |-----------------------------------------------+
| .-RESTRICT-. |
'-DROP--+-METHOD--method-name--------------------------------+--+----------+--'
+-METHOD--method-name--(--+-------------------+---)--+
| | .-,-----------. | |
| | V | | |
| '----data-type---+--' |
'-SPECIFIC METHOD--specific-name---------------------'
>--------------------------------------------------------------><
注:
- 属性とメソッドの両方が追加または削除される場合、
すべてのメソッド指定の前に、すべての属性指定が必要です。
説明
- type-name
- 変更する構造タイプを識別します。
指定するタイプは、カタログに定義されている既存のタイプであり (SQLSTATE 42704)、
かつ構造タイプでなければなりません (SQLSTATE 428DP)。
動的 SQL ステートメントでは、CURRENT SCHEMA 特殊レジスターは、
修飾子のないオブジェクト名の修飾子として使用されます。
静的 SQL ステートメントでは、
QUALIFIER プリコンパイル / バインド・オプションにより、
修飾子のないオブジェクト名の修飾子が暗黙指定されます。
- ADD ATTRIBUTE
- 既存の構造タイプの最後の属性の後に、属性を追加します。
- attribute-definition
- attribute-definition の詳細については、
CREATE TYPE (構造化)を参照してください。
- 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 1
- 属性のデータ・タイプを指定します。
これは、CREATE TABLE でリストされているデータ・タイプの 1 つで、
LONG VARCHAR、LONG VARGRAPHIC、
または 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 オプションがデフォルト値になることに注目してください。
- DROP ATTRIBUTE
- 既存の構造タイプの属性を除去します。
- attribute-name
- 属性の名前。
属性は、そのタイプの属性として存在していなければなりません (SQLSTATE 42703)。
- RESTRICT
- type-name が既存の表、視点、列、列のタイプ内でネストされた属性、
または索引拡張のタイプとして使用される場合に、どの属性も除去できないという規則を課します。
- ADD method-specification
- メソッド指定を、type-name で識別されるタイプに追加します。
別個の CREATE METHOD ステートメントを使用してメソッドに本体を与えるまでは、
このメソッドを使用することはできません。
method-specification についての詳細は、CREATE TYPE (構造化) を参照してください。
- DROP METHOD
- 除去するメソッドのインスタンスを指定します。
指定されたメソッドには、既存のメソッド本体があってはなりません (SQLSTATE 428ER)。
DROP METHOD ステートメントを使用してメソッド本体を除去してから、
ALTER TYPE DROP METHOD を使用してください。
指定するメソッドは、
カタログに記述されているメソッドでなければなりません (SQLSTATE 42704)。
CREATE TYPE ステートメントで暗黙的に生成されたメソッド (mutators および observers など) は、
除去できません (SQLSTATE 42917)。
メソッドを除去する方法としては、次のようにいくつかの方法があります。
- METHOD method-name
- 特定のメソッドを指定します。
名前 method-name およびサブジェクト・タイプ type-name のメソッド・インスタンスが 1 つだけ存在している場合にのみ有効です。
このように識別されるメソッドには、パラメーターがいくつあっても構いません。
タイプ type-name に、指定された名前のメソッドが存在しない場合は、
エラーが戻されます (SQLSTATE 42704)。
指定されたデータ・タイプの名前 method-name に複数のメソッドがある場合には、
エラーが戻されます (SQLSTATE 42854)。
- METHOD method-name (data-type,...)
- 除去するメソッドを固有に指定するメソッド・シグニチャーを指定します。
メソッド選択のアルゴリズムは使用されません。
- method-name
- 特定のタイプを除去するメソッドの名前。
この名前は、修飾子のない識別子でなければなりません。
- (data-type,...)
- メソッドが定義された際のメソッド指定の
対応する位置に指定されたデータ・タイプに一致していなければなりません。
データ・タイプの数とデータ・タイプを論理的に連結した値が、
除去する特定のメソッド・インスタンスを識別するのに使用されます。
パラメーター化データ・タイプの長さ、精度、または位取りを指定する必要はありません。
空の括弧をコーディングすることによって、
一致データ・タイプの検索時にそれらの属性を無視すべきことを指定することができます。
パラメーター値が異なるデータ・タイプ (REAL または DOUBLE) を示しているため、
FLOAT() を使用することはできません (SQLSTATE 42601)。
ただし、長さ、精度、または位取りをコーディングする場合、
その値は、CREATE TYPE ステートメントにおける指定に完全に一致していなければなりません。
0 <n<25 は REAL を意味し、24<n<54 は DOUBLE を意味するので、
FLOAT(n) のデータ・タイプは、n に定義された値と一致している必要はありません。
タイプが REAL か DOUBLE かによって、生じる一致は異なってきます。
指定されたデータ・タイプに、指定されたシグニチャーを持つメソッドが存在しない場合は、
エラーが戻されます (SQLSTATE 42883)。
- SPECIFIC METHOD specific-name
- メソッドの定義時に指定されたか、
またはデフォルト値として与えられた特定の名前を使用して、除去するメソッドを指定します。
specific-name が修飾なしの名前である場合には、メソッドは、
type-name で指定されるデータ・タイプのスキーマで暗黙的に修飾されます。
specific-name は、タイプ type-name のメソッドを識別しなければなりません。
そうでない場合には、エラーになります (SQLSTATE 42704)。
- RESTRICT
- 指定されたメソッドが、
既存のメソッド本体を所持できないように制限を受けることを指示します。
DROP METHOD ステートメントを使用してメソッド本体を除去してから、
ALTER TYPE DROP METHOD を使用してください。
規則
- 以下の場合には、
タイプ type-name で属性を追加または除去することは許可されていません (SQLSTATE 55043)。
- あるタイプまたはそのタイプのサブタイプの 1 つが既存の表のタイプである場合。
- タイプが直接または間接的に type-name を使用する表の列が存在する場合。
直接使用 および 間接使用 という用語は、
構造タイプで定義されています。
- 索引拡張で、このタイプまたはサブタイプのいずれかが使用される場合。
- 属性の追加によるタイプの変更で、
このタイプまたはサブタイプの属性の合計が 4082 を超えてはなりません (SQLSTATE 54050)。
- ADD ATTRIBUTE オプション:
- ADD ATTRIBUTE は、新しい属性に observer および mutator メソッドを生成します。
これらのメソッドは、CREATE TYPE (構造化)に説明されているとおり、
構造タイプが作成される際に生成されるタイプに類似しています。
これらのメソッドが任意の既存のメソッドまたは関数と競合したり、
これらをオーバーライドしたりする場合には、
ALTER TYPE ステートメントは失敗します (SQLSTATE 42745)。
- ユーザーがタイプ (またはこの任意のサブタイプ) の INLINE LENGTH を
明示的に 292 よりも小さい値に指定した場合で、追加したこの属性が原因で、
指定されたインライン長が、
変更されたタイプのコンストラクター関数の結果のサイズよりも小さくなる場合 (32 バイト + 属性ごとに 10 バイト)、
エラーになります (SQLSTATE 42611)。
- DROP ATTRIBUTE オプション:
- 既存のスーパータイプから継承された属性は、除去できません (SQLSTATE 428DJ)。
- DROP ATTRIBUTE は、除去された属性の mutator および observer メソッドを除去し、
これらの除去されたメソッドの従属性を検査します。
注
- 属性を追加または除去することによりタイプを変更すると、
そのタイプまたはそのタイプのサブタイプをパラメーターまたは結果として使用する
関数またはメソッドに依存するすべてのパッケージが無効になります。
- 構造タイプから属性を追加または除去する場合:
- タイプが作成されたときにシステムによりタイプの INLINE LENGTH が計算された場合、
INLINE LENGTH 値は自動的に、変更されたタイプについて修正され、
そのサブタイプもすべて変更に対応するように修正されます。
すべての構造タイプについても、INLINE LENGTH 値は自動的に (再帰的に) 変更されます。
この場合、INLINE LENGTH はシステムにより計算され、
変更された INLINE LENGTH を持つタイプの属性がタイプに含まれています。
- 属性の追加または除去により影響を受けたタイプの INLINE LENGTH が
ユーザーにより明示的に指定されたものである場合、
この特定のタイプの INLINE LENGTH は変更されません。
明示的に指定されたインライン長については、十分に注意してください。
後でタイプに属性が追加されることがある場合、
列定義でこのタイプまたはサブタイプの 1 つを使用するために、
インスタンス化されたオブジェクトの長さの増加の可能性に対応できるように、
インライン長を十分に大きくしておかなければなりません。
- 新しい属性がアプリケーション・プログラムから見えるようにするには、
データ・タイプの新しい構造に適合するように、既存の変形機能を修正しなければなりません。
例
例 1:
ALTER TYPE ステートメントを使用して、
手動で参照しているタイプおよび表の循環を許可します。
EMPLOYEE および DEPARTMENT という名前の表を手動で参照しているとします。
次の順序列で、タイプおよび表の作成ができます。
CREATE TYPE DEPT ...
CREATE TYPE EMP ... (REF(DEPT) というタイプの DEPTREF という属性を含む)
ALTER TYPE DEPT ADD ATTRIBUTE MANAGER REF(EMP)
CREATE TABLE DEPARTMENT OF DEPT ...
CREATE TABLE EMPLOYEE OF EMP (DEPTREF WITH OPTIONS SCOPE DEPARTMENT)
ALTER TABLE DEPARTMENT ALTER COLUMN MANAGER ADD SCOPE EMPLOYEE
次の順序列で、タイプおよび表の除去ができます。
DROP TABLE EMPLOYEE (DEPARTMENT の MANAGER 列が効力範囲解除となる)
DROP TABLE DEPARTMENT
ALTER TYPE DEPT DROP ATTRIBUTE MANAGER
DROP TYPE EMP
DROP TYPE DEPT
例 2:
ALTER TYPE ステートメントを使用して、サブタイプを参照する属性を持つタイプを作成します。
CREATE TYPE EMP ...
CREATE TYPE MGR UNDER EMP ...
ALTER TYPE EMP ADD ATTRIBUTE MANAGER REF(MGR)
例 3: ALTER TYPE ステートメントを使用して、
属性を追加します。
以下のステートメントは、EMP タイプに SPECIAL 属性を追加します。
元の CREATE TYPE ステートメントでインライン長が指定されなかったため、DB2 は、
13 (新しい属性の 10 + 属性長 + 非 LOB 属性の 2 バイト) を追加してインライン長を計算しなおします。
ALTER TYPE EMP ...
ADD ATTRIBUTE SPECIAL CHAR(1)
例 4: ALTER TYPE ステートメントを使用して、
タイプに関連するメソッドを追加します。
以下のステートメントは、BONUS というメソッドを追加します。
ALTER TYPE EMP ...
ADD METHOD BONUS (RATE DOUBLE)
RETURNS INTEGER
LANGUAGE SQL
CONTAINS SQL
NO EXTERNAL ACTION
DETERMINISTIC
CREATE METHOD ステートメントを発行してメソッド本体を作成するまでは、
BONUS メソッドは使用できないことに注意してください。
タイプ EMP に SALARY という属性が含まれているとすると、
メソッド本体の定義例は以下のようになります。
CREATE METHOD BONUS(RATE DOUBLE) FOR EMP
RETURN CAST(SELF.SALARY * RATE AS INTEGER)
このステートメントについては、CREATE METHOD を参照してください。
[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]