SQL 解説書

ALTER TYPE (構造化)

ALTER TYPE ステートメントは、 ユーザー定義の構造タイプの属性またはメソッド指定を追加または除去します。

呼び出し

このステートメントは、アプリケーション・プログラムに組み込むか、 または動的 SQL ステートメントを使用して発行することができます。 このステートメントは、動的に準備可能な実行可能ステートメントです。 しかし、バインド・オプション DYNAMICRULES BIND を適用する場合、 ステートメントを動的に準備することはできません (SQLSTATE 42509)。

許可

このステートメントの許可 ID には、以下の特権が少なくとも 1 つ含まれている必要があります。

構文

>>-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---------------------'
 
>--------------------------------------------------------------><
 

注:

  1. 属性とメソッドの両方が追加または削除される場合、 すべてのメソッド指定の前に、すべての属性指定が必要です。

説明

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 を使用してください。

規則

例 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 を参照してください。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]