ALTER
TYPE
文は、メンバー属性またはメソッドを追加または削除します。 オブジェクト型の既存のプロパティ(FINAL
またはINSTANTIABLE
)を変更し、型のスカラー属性を変更できます。
この文を使用すると、新しいオブジェクト・メンバーのサブプログラム仕様を追加することによって、型の仕様部または本体を再コンパイルしたり、オブジェクト型の仕様を変更することもできます。
前提条件
オブジェクト型が自身のスキーマ内にあり、CREATE
TYPE
またはCREATE
ANY
TYPE
システム権限を所有しているか、またはALTER
ANY
TYPE
システム権限を所有している必要があります。
構文
alter_type::=
(compile_type_clause ::=、replace_type_clause ::=、alter_method_spec ::=、alter_attribute_definition::=、alter_collection_clauses::=、dependent_handling_clause ::=)
element_spec ::=
(inheritance_clauses::=、subprogram_spec::=、constructor_spec::=、map_order_function_spec::=、pragma_clause ::=)
(procedure_spec::=、function_spec::=)
constructor_spec::=
pragma_clause ::=
(map_order_function_spec::=、subprogram_spec::=)
キーワードとパラメータの説明
schema
型が含まれているスキーマを指定します。 schema
を省略すると、型は現行のスキーマ内に存在するとみなされます。
type
オブジェクト型、ネストした表型またはVARRAY型の名前を指定します。
COMPILE
を指定すると、オブジェクト型の仕様部および本体をコンパイルすることができます。 SPECIFICATION
およびBODY
がいずれも指定されていない場合は、これがデフォルトです。
再コンパイル中、コンパイラの永続的なスイッチ設定はすべて削除され、セッションから再度取得されてコンパイルの最後に格納されます。 この処理を回避するには、REUSE
SETTINGS
句を指定します。
型の再コンパイル時にコンパイル・エラーが発生した場合は、データベースによってエラーが戻され、型は無効なままになります。 関連付けられているコンパイラ・エラー・メッセージは、SQL*PlusコマンドSHOW
ERRORS
を使用して確認できます。
DEBUG
を指定すると、PL/SQLデバッガで使用するためのコードを生成して格納するようにPL/SQLコンパイラに指示できます。 この句を指定した場合の効果は、compiler_parameters_clause
でPLSQL_DEBUG
= TRUE
を指定した場合と同じです。
SPECIFICATION
SPECIFICATION
を指定すると、オブジェクト型の仕様部のみをコンパイルすることができます。
BODY
BODY
を指定すると、オブジェクト型の本体のみをコンパイルすることができます。
この句の型に対する動作は、ファンクションに対する動作と同様です。 詳細は、「ALTER
FUNCTION
」の「compiler_parameters_clause」を参照してください。
この句の型に対する動作は、ファンクションに対する動作と同様です。 詳細は、「ALTER
FUNCTION」
の「REUSE SETTINGS」を参照してください。
REPLACE
句を使用すると、新しいメンバー・サブプログラム仕様部を追加できます。 この句は、オブジェクト型に対してのみ有効であり、ネストした表またはVARRAYに対しては無効です。
attribute
オブジェクト属性名を指定します。 属性は、オブジェクトの構造を形成する、名前および型指定子を持つデータ項目です。
element_spec
再定義されたオブジェクトの要素を指定します。
inheritance_clauses inheritance_clauses
のセマンティクスは、CREATE
TYPE
およびALTER
TYPE
文のセマンティクスと同じです。
subprogram_spec
MEMBER
およびSTATIC
句を使用すると、属性として参照されるファンクションまたはプロシージャ・サブプログラムをオブジェクト型に対して指定できます。
プロシージャの仕様部またはファンクションの仕様部ごとに、対応するメソッド本体をオブジェクト型本体に指定する必要があります。
参照:
|
procedure_spec プロシージャ・サブプログラムの仕様部を入力します。
function_spec ファンクション・サブプログラムの仕様部を入力します。
pragma_clause pragma_clause
は、データベース表またはパッケージ変数(あるいはその両方)に対するメンバー・ファンクションの読取り/書込みアクセスを拒否することによって、副作用の発生の防止に役立つコンパイラ・ディレクティブです。
注意: この句は非推奨となっています。 アプリケーションの下位互換性を保つ必要がないかぎり、この句は使用しないことをお薦めします。現在は、データベースによって実行時に純正度チェックが実行されます。 アプリケーションの下位互換性を保つためにこの句を使用する必要がある場合は、「CREATE TYPE文」のこの句に関する項を参照してください。 |
プラグマの制限 pragma_clause
は、メソッドの削除には無効になります。
参照: プラグマの詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を参照してください。 |
map_order_function_spec 宣言するMEMBER
またはSTATIC
メソッドの数に関係なく、1つのMAP
メソッドまたは1つのORDER
メソッドを宣言できます。 ただし、スーパータイプでNOT
FINAL
MAP
メソッドを定義する場合は、サブタイプでMAP
メソッドをオーバーライドできます。 いずれかのメソッドを宣言すると、SQLでオブジェクト・インスタンスを比較できます。
いずれのメソッドも宣言しない場合、オブジェクト・インスタンスに関して比較できるのは等しいか等しくないかについてのみです。 同じ型定義のインスタンスは、それぞれの対応する属性の各ペアが等しい場合にのみ等しくなります。 2つのオブジェクト型が等しいかどうかを判断するために、比較メソッドを指定する必要はありません。
MAP
の場合は、オブジェクトのすべてのインスタンスの順序における特定のインスタンスの相対的な位置を戻すメンバー・ファンクション(MAP
メソッド)を指定します。 マップ・メソッドは暗黙的にコールされ、オブジェクト・インスタンスを事前定義済のスカラー型の値にマップすることによって、それらのオブジェクト・インスタンスに順序を設定します。データベースでは、比較条件およびORDER
BY
句にこの順序が使用されます。
ソート(ORDER
BY
、GROUP
BY
、DISTINCT
またはUNION
句を使用)または結合を含む問合せでtype
が参照される場合に、それらの問合せをパラレル化するには、MAP
メンバー・ファンクションを指定する必要があります。
MAP
メソッドの引数がNULLの場合は、MAP
メソッドによってNULLが戻され、メソッドは起動されません。
オブジェクトの仕様部には1つのMAP
メソッドのみを含めることができ、このメソッドはファンクションである必要があります。 結果として生成される型は、事前定義済のSQLスカラー型である必要があります。また、MAP
ファンクションに指定できる引数は、暗黙的なSELF
引数のみです。
サブタイプでは、新しいMAP
メソッドを定義できません。 ただし、継承されたMAP
メソッドはオーバーライドできます。
ORDER
の場合は、オブジェクトのインスタンスを明示的な引数および暗黙的なSELF
引数として取り、負の整数、0(ゼロ)または正の整数のいずれかを戻すメンバー・ファンクション(ORDER
メソッド)を指定します。 負の値、0(ゼロ)または正の値は、暗黙的なSELF
引数が明示的な引数より小さいか、等しいかまたは大きいことを示します。
ORDER
メソッドのいずれかの引数がNULLの場合は、ORDER
メソッドによってNULLが戻され、メソッドは起動されません。
同じオブジェクト型定義のインスタンスをORDER
BY
句で比較すると、ORDER
メソッド・ファンクションが起動されます。
オブジェクトの仕様部には1つのORDER
メソッドのみを含めることができ、このメソッドは戻り型NUMBER
を持つファンクションである必要があります。
サブタイプでは、ORDER
メソッドを定義したり、継承されたORDER
メソッドをオーバーライドしたりすることはできません。
メンバー・ファンクションのAUTHID
プロパティおよびオブジェクト型のプロシージャを指定します。 AUTHID
プロパティの詳細は、「実行者権限または定義者権限の使用(AUTHID句)」を参照してください。
実行者権限の制限 この句は、オブジェクト型にのみ指定でき、ネストした表またはVARRAYには指定できません。
AUTHID CURRENT_USER句 CURRENT_USER
を指定を指定すると、オブジェクト型のメンバー・ファンクションおよびプロシージャをCURRENT_USER
の権限で実行できます。 この句は実行者権限型を作成します。
型を実行者権限ステータスで作成した場合にそのステータスを維持するには、この句を指定する必要があります。 そうしないと、ステータスが定義者権限に戻ります。
また、この句は、問合せ、DML操作および動的SQL文の外部名がCURRENT_USER
のスキーマで解決されるように指定します。 その他すべての文に含まれる外部名は、この型が存在するスキーマで解決されます。
AUTHID DEFINER句 ファンクションおよびプロシージャが存在するスキーマの所有者の権限でオブジェクト型のメンバー・ファンクションおよびプロシージャを実行し、メンバー・ファンクションおよびプロシージャが存在するスキーマで外部名を解決するには、DEFINER
を指定します。 これはデフォルトです。
alter_method_spec
を使用すると、type
のメソッドを追加または削除できます。その型に依存するすべてのファンクション索引がデータベースによって無効にされます。
1つのALTER
TYPE
文で複数のメソッドを追加または削除できますが、各メソッドを参照できるのは1回のみです。
ADD メソッドを追加する場合は、その名前が型階層内の既存の属性と競合しないようにする必要があります。
DROP メソッドを削除すると、そのメソッドがターゲット型から削除されます。
メソッドの削除の制限 スーパータイプから継承されたメソッドをサブタイプから削除することはできません。 かわりに、メソッドをスーパータイプから削除する必要があります。
subprogram_spec MEMBER
およびSTATIC
句を使用すると、オブジェクト型に対してプロシージャ・サブプログラムの追加または削除を行うことができます。
サブプログラムの制限 スーパータイプでMEMBER
メソッドを再定義するSTATIC
メソッドをサブタイプに定義することはできません。逆の場合も同じです。
map_order_function_spec MAP
またはORDER
メソッドを宣言すると、SQLでオブジェクト・インスタンスを比較できます。
MAPおよびORDERメソッドの制限 サブタイプにORDER
メソッドを追加することはできません。
alter_attribute_definition
alter_attribute_definition
句を使用すると、オブジェクト型の属性の追加、削除または変更を行うことができます。 1つのALTER
TYPE
文で複数のメンバー属性またはメソッドを追加、削除または変更できますが、各属性またはメソッドを参照できるのは1回のみです。
ADD ATTRIBUTE 新しい属性の名前は、型階層内の既存の属性またはメソッドと競合しないようにする必要があります。新しい属性は、データベースによって、ローカルに定義された属性リストの最後に追加されます。
属性をスーパータイプに追加すると、すべてのサブタイプに継承されます。 サブタイプでは、継承された属性は宣言された属性より常に優先されます。 そのため、属性をスーパータイプに追加した後で、暗黙的に変更されたサブタイプのマッピングの更新が必要な場合があります。
DROP ATTRIBUTE 属性を型から削除すると、削除した属性に対応する列に加えて、削除した属性を参照している索引、統計および制約も削除されます。
削除する属性のデータ型を指定する必要はありません。
型属性の削除の制限 型属性の削除には、次の制限があります。
スーパータイプから継承された属性は削除できません。 かわりに、属性をスーパータイプから削除する必要があります。
パーティション化キー、サブパーティション化キーまたはクラスタ・キーの一部となっている属性は削除できません。
オブジェクト表の主キー・ベースのオブジェクト識別子または索引構成表の主キーの属性は削除できません。
ルート型のすべての属性を削除することはできません。 かわりに、ルート型を削除する必要があります。 ただし、サブタイプのローカルに宣言されたすべての属性を削除することはできます。
MODIFY ATTRIBUTE この句を使用すると、既存のスカラー属性のデータ型を変更できます。 たとえば、VARCHAR2
またはRAW
属性の長さを増やしたり、数値属性の精度または位取りを増やすことができます。
属性の変更の制限 ファンクション索引、ドメイン索引またはクラスタ・キーで参照されている属性のサイズを拡張することはできません。
[NOT] FINAL
この句を使用すると、この型のサブタイプをさらに作成できるようにするかどうかを指定できます。
FINAL
を指定すると、この型に対してサブタイプをさらに作成できないようにすることができます。
NOT
FINAL
を指定すると、この型に対してサブタイプをさらに作成できるようにすることができます。
プロパティをFINAL
とNOT
FINAL
の間で変更する場合は、dependent_handling_clauseのCASCADE
句を指定して、依存する列および表のデータを変換する必要があります。
型をNOT
FINAL
からFINAL
に変更する場合は、CASCADE
[INCLUDING
TABLE
DATA
]を指定する必要があります。 CASCADE
NOT
INCLUDING
TABLE
DATA
を指定してデータ変換を遅延させることはできません。
型をFINAL
からNOT
FINAL
に変更する場合は、次の操作を実行します。
その型の置換可能な表と列を新しく作成し、既存の依存する表および列の置換可能性を考慮しない場合は、CASCADE
INCLUDING
TABLE
DATA
を指定します。既存のすべての依存する列および表がNOT
SUBSTITUTABLE
AT
ALL
LEVELS
としてマークされるため、変更した型の新しいサブタイプ・インスタンスをこれらの既存の列と表に挿入することはできません。
その型の置換可能な表と列を新しく作成し、既存の依存する表および列に変更された型の新しいサブタイプ・インスタンスを格納する場合は、CASCADE
CONVERT
TO
SUBSTITUTABLE
を指定します。明示的にNOT
SUBSTITUTABLE
AT
ALL
LEVELS
とマークされたものを除いて、既存のすべての依存する列と表がSUBSTITUTABLE
AT
ALL
LEVELS
としてマークされます。
参照: オブジェクト型の進化の詳細は、『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』を参照してください。 |
FINALの制限 ユーザー定義型にサブタイプがある場合、そのユーザー定義型をNOT
FINAL
からFINAL
に変更することはできません。
[NOT] INSTANTIABLE
この句を使用すると、この型のオブジェクト・インスタンスを構成できるかどうかを指定できます。
この型のオブジェクト・インスタンスを構成できる場合は、INSTANTIABLE
を指定します。
このオブジェクト型に対してコンストラクタ(デフォルトまたはユーザー定義)が存在しない場合は、NOT
INSTANTIABLE
を指定します。 インスタンス化ができないメソッドを持つ型、および(継承、またはこの句で指定された)属性を持たない型には、これらのキーワードを指定する必要があります。
NOT INSTANTIABLEの制限 ユーザー定義型に表の依存関係がある場合、そのユーザー定義型をINSTANTIABLE
からNOT
INSTANTIABLE
に変更することはできません。
この句は、コレクション型に対してのみ有効です。
MODIFY LIMIT integer この句を使用すると、VARRAYの要素の数を増やすことができます。 この句は、ネストした表に対しては無効です。 VARRAYの要素の現在の最大数より大きい整数を指定します。
ELEMENT TYPE datatype この句を使用すると、VARRAYまたはネストした表のスカラー・データ型の精度、サイズまたは長さを増やすことができます。 この句は、オブジェクト型のコレクションに対しては無効です。
NUMBER
のコレクションの場合は、精度または位取りを増やすことができます。
RAW
のコレクションの場合は、最大サイズを増やすことができます。
VARCHAR2
またはNVARCHAR2
のコレクションの場合は、最大長を増やすことができます。
dependent_handling_clause
を使用すると、変更された型に依存するオブジェクトの処理方法をデータベースに指示できます。 この句を省略すると、type
に依存する型または表がある場合にALTER
TYPE
文が終了します。
INVALIDATE句
INVALIDATE
を指定すると、チェック・メカニズムを使用しないですべての依存オブジェクトを無効にできます。
注意: データベースによって型の変更は検証されないため、この句の使用には注意が必要です。 たとえば、パーティション化キーまたはクラスタ・キーである属性を削除すると、表に書き込むことができなくなります。 |
CASCADE句
CASCADE
句を指定すると、型の変更を依存する型および表に伝播することができます。FORCE
も指定しないかぎり、依存する型または表でエラーが検出された場合は文が終了します。
型のプロパティをFINAL
とNOT
FINAL
の間で変更する場合は、この句を指定して、依存する列および表のデータを変換する必要があります。 詳細は、「[NOT] FINAL」を参照してください。
INCLUDING TABLE DATA INCLUDING
TABLE
DATA
を指定すると、すべてのユーザー定義列に格納されているデータを最新バージョンの列型に変換できます。 これはデフォルトです。
注意: 列データがOracle Databaseバージョン8.0のイメージ・フォーマットの場合は、この句を指定する必要があります。 この句は、型のプロパティをFINAL とNOT FINAL の間で変更する場合も必須です。 |
列型に追加された属性ごとに、データベースによってデータに新しい属性が追加され、NULLに初期化されます。
参照される型から削除された属性ごとに、対応する属性データが表の各行から削除されます。
INCLUDING
TABLE
DATA
を指定する場合は、表データを含むすべての表領域が読取り/書込みモードである必要があります。
NOT
INCLUDING
TABLE
DATA
を指定すると、データベースによって列のメタデータがアップグレードされ、その型に対する変更が反映されますが、このALTER
TYPE
文の一部として依存する列はスキャンされず、データは更新されません。 ただし、依存する列データはアクセス可能なままであり、後続のデータの問合せ結果には型の変更が反映されます。
参照: 型属性の変更時に表データを含めない場合の影響の詳細は、『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』を参照してください。 |
CONVERT TO SUBSTITUTABLE FINAL
からNOT
FINAL
への型の変更、その型の置換可能な表と列の新規作成、および既存の依存する表と列への変更した型の新しいサブタイプ・インスタンスの格納も行う場合は、この句を指定します。 詳細は、「[NOT] FINAL」を参照してください。
exceptions_clause 依存する表および索引からのエラーを無視し、指定した例外表にすべてのエラーを記録する場合は、FORCE
を指定します。 DBMS_UTILITY.CREATE_ALTER_TYPE_ERROR_TABLE
プロシージャを実行して、例外表がすでに作成されている必要があります。
例
メンバー・ファンクションの追加: 例 次の例では、data_typ1
オブジェクト型を使用します。 このオブジェクト型を作成する例については、「オブジェクト型の例」を参照してください。 メソッドがdata_typ1
に追加され、その型本体がそれに対応するように変更されます。 日付書式は、oe.orders
サンプル表のorder_date
列と一致しています。
ALTER TYPE data_typ1 ADD MEMBER FUNCTION qtr(der_qtr DATE) RETURN CHAR CASCADE; CREATE OR REPLACE TYPE BODY data_typ1 IS MEMBER FUNCTION prod (invent NUMBER) RETURN NUMBER IS BEGIN RETURN (year + invent); END; MEMBER FUNCTION qtr(der_qtr DATE) RETURN CHAR IS BEGIN IF (der_qtr < TO_DATE('01-APR', 'DD-MON')) THEN RETURN 'FIRST'; ELSIF (der_qtr < TO_DATE('01-JUL', 'DD-MON')) THEN RETURN 'SECOND'; ELSIF (der_qtr < TO_DATE('01-OCT', 'DD-MON')) THEN RETURN 'THIRD'; ELSE RETURN 'FOURTH'; END IF; END; END; /
コレクション属性の追加: 例 次の例では、author
属性をtext
表のtextdoc_tab
オブジェクト列に追加します。 基礎となるtextdoc_typ
型を作成する例については、「オブジェクト型の例」を参照してください。
CREATE TABLE text ( doc_id NUMBER, description textdoc_tab) NESTED TABLE description STORE AS text_store; ALTER TYPE textdoc_typ ADD ATTRIBUTE (author VARCHAR2) CASCADE;
textdoc_tab
表とtext
表の両方がtextdoc_typ
型に依存しているため、CASCADE
キーワードは必須です。
コレクション型の要素の数の増加: 例 次の例では、VARRAY phone_list_typ_demo
の要素の最大数を増やします。 この型を作成する例については、「オブジェクト型の例」を参照してください。
ALTER TYPE phone_list_typ_demo MODIFY LIMIT 10 CASCADE;
コレクション型の長さの増加: 例 次の例では、VARRAY要素型phone_list_typ
の長さを増やします。
ALTER TYPE phone_list_typ MODIFY ELEMENT TYPE VARCHAR(64) CASCADE;
型の再コンパイル: 例 次の例では、hr
スキーマのcust_address_typ
型を再コンパイルします。
ALTER TYPE cust_address_typ2 COMPILE;
型仕様部の再コンパイル: 例 次の例では、link2
の型仕様をコンパイルします。
CREATE TYPE link1 AS OBJECT (a NUMBER); / CREATE TYPE link2 AS OBJECT (a NUMBER, b link1, MEMBER FUNCTION p(c1 NUMBER) RETURN NUMBER); / CREATE TYPE BODY link2 AS MEMBER FUNCTION p(c1 NUMBER) RETURN NUMBER IS BEGIN dbms_output.put_line(c1); RETURN c1; END; END; /
次の例では、link2
の属性であるlink1
が変更されるため、link2
の仕様部と本体の両方が無効になります。
ALTER TYPE link1 ADD ATTRIBUTE (b NUMBER) INVALIDATE;
仕様部と本体を別々の文で再コンパイルすることによって、型を再コンパイルする必要があります。
ALTER TYPE link2 COMPILE SPECIFICATION; ALTER TYPE link2 COMPILE BODY;
また、仕様部と本体を同時にコンパイルすることもできます。
ALTER TYPE link2 COMPILE;
関連トピック