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;
関連トピック