ALTER TYPE (構造化) ステートメント

ALTER TYPE ステートメントは、 ユーザー定義の構造化タイプの属性またはメソッド指定を追加またはドロップします。 既存のメソッドのプロパティーも変更が可能です。

呼び出し

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

許可

ステートメントの許可 ID によって保持されている特権には、少なくとも以下のいずれかの権限が含まれていなければなりません。
  • タイプのスキーマに対する ALTERIN 特権
  • SYSCAT.DATATYPES カタログ・ビューの OWNER 列に記録されているそのタイプの所有者
  • タイプのスキーマに対する SCHEMAADM 権限
  • DBADM 権限
fenced でないようにメソッドを変更するには、 ステートメントの許可 ID の特権に以下の権限の少なくとも 1 つが含まれている必要があります。
  • データベースに対する CREATE_NOT_FENCED_ROUTINE 権限
  • DBADM 権限

fenced であるようにメソッドを変更するには、さらに別の権限や特権は必要ありません。

構文

構文図を読む構文図をスキップするALTER TYPEtype-nameADD ATTRIBUTEattribute-definitionDROP ATTRIBUTEattribute-nameRESTRICTADD METHOD method-specificationALTER method-identifiermethod-optionsDROPmethod-identifierRESTRICT
method-identifier
構文図を読む構文図をスキップするMETHODmethod-name((,data-type))SPECIFIC METHODspecific-name
method-options
構文図を読む構文図をスキップするFENCEDNOT FENCEDTHREADSAFENOT THREADSAFE

説明

type-name
変更する構造化タイプを識別します。 指定するタイプは、カタログに定義されている既存のタイプであり (SQLSTATE 42704)、 かつ構造化タイプでなければなりません (SQLSTATE 428DP)。 動的 SQL ステートメントでは、CURRENT SCHEMA 特殊レジスターが、 修飾子のないオブジェクト名の修飾子として使用されます。 静的 SQL ステートメントでは、QUALIFIER プリコンパイル/ BIND オプションによって、 修飾子のないオブジェクト名の修飾子が暗黙指定されます。
ADD ATTRIBUTE
既存の構造化タイプの最後の属性の後に、属性を追加します。
attribute-definition
構造化タイプの属性を定義します。
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 つで、XML 以外のものです (SQLSTATE 42601)。このデータ・タイプには既存のデータ・タイプを指定する必要があります (SQLSTATE 42704)。 data-type がスキーマ名なしで指定される場合、 SQL パス上でスキーマを検索することにより、タイプは解決されます。 『CREATE TABLE』に種々のデータ・タイプの説明が記載されています。 属性データ・タイプが参照タイプである場合、 参照するターゲット・タイプはこのステートメントに既に存在する構造化タイプでなければなりません (SQLSTATE 42704)。

実行時にタイプのインスタンスが直接または間接的に同じタイプやそのサブタイプのインスタンスを含むタイプ定義を避けるために、 タイプの定義において、 属性タイプのいずれかが直接または間接的にそれ自身を使用するように定義してはならないという制限があります (SQLSTATE 428EP)。

文字データ・タイプおよびグラフィック・ストリング・データ・タイプでは、CODEUNITS32 のストリング単位を指定することはできません。

lob-options
LOB タイプと関連したオプション (あるいは LOB に基づく特殊タイプ) を指定します。 lob-options の詳細については、『CREATE TABLE』を参照してください。
DROP ATTRIBUTE
既存の構造化タイプの属性をドロップします。
attribute-name
属性の名前。 属性は、そのタイプの属性として存在していなければなりません (SQLSTATE 42703)。
RESTRICT
type-name が既存の表、ビュー、列、列のタイプ内でネストされた属性、 または索引拡張のタイプとして使用される場合に、どの属性もドロップできないという規則を課します。
ADD METHOD method-specification
メソッド指定を、type-name で識別されるタイプに追加します。 別個の CREATE METHOD ステートメントを使用してメソッドに本体を与えるまでは、 このメソッドを使用することはできません。 method-specification についての詳細は、『CREATE TYPE (構造化)』を参照してください。
ALTER method-identifier
変更されるメソッドのインスタンスを一意的に指定します。 指定されたメソッドには、既存のメソッド本体があるかもしれませんし、ないかもしれません。 LANGUAGE SQL として宣言されたメソッドは変更できません (SQLSTATE 42917)。
method-identifier
METHOD method-name
特定のメソッドを指定します。 type-name というサブジェクト・タイプの method-name という名前の メソッド・インスタンスが 1 つだけ存在している場合にのみ有効です。 このように指定されたメソッドには、任意の数のパラメーターを定義できます。 タイプに、指定された名前のメソッドが存在しない場合は、 エラーが戻されます (SQLSTATE 42704)。 タイプに、そのメソッドのインスタンスが複数存在する場合も、 エラーが戻されます (SQLSTATE 42725)。
METHOD method-name (data-type,...)
メソッドを一意に指定するメソッド・シグニチャーを指定します。 メソッド解決のアルゴリズムは使用されません。
method-name
type-name タイプのメソッドの名前を指定します。
(data-type,...)
値は、 CREATE TYPE ステートメント上で (対応する位置に) 指定されたデータ・タイプと一致していなければなりません。 データ・タイプの数、およびデータ・タイプを論理的に連結した値が、 特定のメソッド・インスタンスを識別するのに使用されます。

data-type が修飾なしの場合は、SQL パス上でスキーマを検索してタイプ名が決定されます。 REFERENCE タイプに指定するデータ・タイプ名にも同様の規則が当てはまります。

パラメーター化データ・タイプの長さ、精度、または位取りを指定する必要はありません。 空の括弧をコーディングすることによって、 一致データ・タイプの検索時にそれらの属性を無視するように指定することができます。

パラメーター値が異なるデータ・タイプ (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
メソッドの作成時に指定された名前か、デフォルト値として与えられた名前を使用して、 特定のメソッドを識別します。 動的 SQL ステートメントでは、CURRENT SCHEMA 特殊レジスターが、 修飾子のないオブジェクト名の修飾子として使用されます。 静的 SQL ステートメントでは、QUALIFIER プリコンパイル/BIND オプションによって、 修飾子のないオブジェクト名の修飾子が暗黙指定されます。 specific-name (特定名) は、 指定したスキーマまたは暗黙のスキーマの特定のメソッド・インスタンスを指定していなければなりません。 そうでない場合、エラー (SQLSTATE 42704) になります。
method-options
メソッドに対して変更されるオプションを指定します。
FENCED または NOT FENCED
メソッドをデータベース・マネージャーのオペレーティング環境の プロセスまたはアドレス・スペースで実行しても安全か (NOT FENCED)、 そうでないか (FENCED) を指定します。 多くのメソッドは、FENCED または NOT FENCED のどちらかで実行するように選択することができます。

メソッドが FENCED として登録されると、データベース・マネージャーは、 その内部リソース (データ・バッファーなど) を fenced して、そのメソッドからアクセスされないようにします。 一般に、FENCED として実行されるメソッドは、 NOT FENCED として実行されるものと同じようには実行されません。

注意:
コーディング、レビュー、およびテストが適切に行われていないメソッドに NOT FENCED を使用すると、データベースの整合性が損なわれる恐れがあります。 データベース・エンジンでは、発生する可能性のある一般的な不注意による障害の多くに対して、いくつかの予防措置がとられていますが、NOT FENCED メソッドが使用される場合には、完全な整合性を確保できません。

NOT THREADSAFE を宣言したメソッドは、NOT FENCED には変更できません (SQLSTATE 42613)。

メソッドが定義済みの AS LOCATOR の任意のパラメーターを有していて、 NO SQL オプションが指定されていた場合には、このメソッドは FENCED には変更できません (SQLSTATE 42613)。

このオプションは LANGUAGE OLE メソッドを変更できません (SQLSTATE 42849)。

THREADSAFE または NOT THREADSAFE
メソッドを他のルーチンと同じプロセスで実行しても安全か (THREADSAFE)、 そうでないか (NOT THREADSAFE) を指定します。
メソッドが OLE 以外の LANGUAGE で定義される場合:
  • メソッドが THREADSAFE に定義されている場合には、 データベース・マネージャーは他のルーチンと同じプロセスでメソッドを呼び出すことができます。 一般に、スレッド・セーフにするには、 メソッドはどのグローバルあるいは静的データ域をも使用してはなりません。 多くのプログラミング解説書には、スレッド・セーフ・ルーチンの作成に関する説明が含まれています。 FENCED および NOT FENCED メソッドの両方が THREADSAFE になることが可能です。 メソッドが LANGUAGE OLE とともに定義される場合には、THREADSAFE は指定されません (SQLSTATE 42613)。
  • メソッドが NOT THREADSAFE として定義される場合には、 データベース・マネージャーは他のルーチンと同じプロセスにメソッドを決して呼び出しません。fenced されたメソッドだけが、NOT THREADSAFE になり得ます (SQLSTATE 42613)。
DROP method-identifier
一意的にドロップするメソッドのインスタンスを指定します。 指定されたメソッドには、既存のメソッド本体があってはなりません (SQLSTATE 428ER)。 DROP METHOD ステートメントを使用してメソッド本体をドロップしてから、 ALTER TYPE DROP METHOD を使用してください。 CREATE TYPE ステートメントで暗黙的に生成されたメソッド (mutators および observers など) は、 ドロップできません (SQLSTATE 42917)。
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 メソッドをドロップし、 これらのドロップされたメソッドの従属性を検査します。
  • DROP METHOD オプション:
    • 他のメソッドによってオーバーライドされた元のメソッドは、ドロップできません (SQLSTATE 42893)。

  • SYSIBM、SYSFUN、または SYSPROC スキーマのメソッドは変更できません (SQLSTATE 42832)。
  • 属性を追加またはドロップしてタイプを変更すると、 そのタイプまたはそのタイプのサブタイプをパラメーターまたは結果として使用する 関数またはメソッドに依存するすべてのパッケージは無効になります。
  • 構造化タイプから属性を追加またはドロップする場合:
    • タイプが作成されたときにシステムによりタイプの INLINE LENGTH が計算された場合、 INLINE LENGTH 値は自動的に、変更されたタイプについて修正され、 そのサブタイプもすべて変更に対応するように修正されます。 すべての構造化タイプについても、INLINE LENGTH 値は自動的に (再帰的に) 変更されます。 この場合、INLINE LENGTH はシステムにより計算され、 変更された INLINE LENGTH を持つタイプの属性がタイプに含まれています。
    • 属性の追加またはドロップにより影響を受けるタイプの INLINE LENGTH が ユーザーにより明示的に指定されたものである場合、 この特定のタイプの INLINE LENGTH は変更されません。 明示的に指定されたインライン長については、十分に注意してください。 後でタイプに属性が追加されることがある場合、 列定義でこのタイプまたはサブタイプの 1 つを使用するために、 インスタンス化されたオブジェクトの長さの増加の可能性に対応できるように、 インライン長を十分に大きくしておかなければなりません。
    • 新しい属性がアプリケーション・プログラムから見えるようにするには、 データ・タイプの新しい構造に適合するように、既存のトランスフォーム機能を修正しなければなりません。
  • パーティション・データベース環境では、 外部ユーザー定義関数またはメソッドでの SQL の使用はサポートされていません (SQLSTATE 42997)。
  • 特権: EXECUTE 特権は、メソッド本体が CREATE METHOD ステートメントを使用して定義されるまでは、ALTER TYPE ステートメントで明示的に指定されたすべてのメソッドには与えられません。ユーザー定義タイプの所有者には、ALTER TYPE ステートメントを使用して、 メソッド指定をドロップする特権があります。

  • 例 1: ALTER TYPE ステートメントを使用して、 相互参照するタイプおよび表の循環を許可します。 EMPLOYEE および DEPARTMENT という名前の表を手動で参照しているとします。

    次のシーケンスで、タイプおよび表の作成ができます。

       CREATE TYPE DEPT ...
       CREATE TYPE EMP ... (including attribute named DEPTREF of type REF(DEPT))
       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 ステートメントでインライン長が指定されていなかったため、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)