ALTER TYPE文は、「CREATE TYPE文」および「CREATE TYPE BODY文」で作成された型に対して次のいずれかを実行します。
型を進化させます。つまり、メンバー属性またはメソッドを追加または削除します。
型の進化の詳細は、『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』を参照してください。
オブジェクト・メンバーのサブプログラム仕様部を追加することによって、型の仕様部を変更します。
型の仕様部または本体を再コンパイルします。
型のバージョンを1に再設定し、進化の対象とみなされないようにします。
ここでのトピック
前提条件
型がSYSスキーマ内にある場合、SYSDBAとして接続する必要があります。そうでない場合は、型が自分のスキーマ内にあり、CREATE TYPEまたはCREATE ANY TYPEシステム権限を所有しているか、またはALTER ANY TYPEシステム権限を所有している必要があります。
構文
alter_type::=
alter_type_clause ::=
参照:
type_compile_clause ::=
compiler_parameters_clause::=
invoker_rights_clause ::=
element_spec ::=
参照:
inheritance_clauses ::=
function_spec ::=
pragma_clause ::=
alter_method_spec ::=
参照:
alter_attribute_definition::=
alter_collections_clauses::=
dependent_handling_clause ::=
exceptions_clause::=
セマンティクス
schema
型が含まれているスキーマの名前。デフォルト: 自分のスキーマ。
type_name
ADT、VARRAY型、またはネストした表型の名前。
type_nameの制限
エディション化したADTを進化させることはできません。
次のいずれかに該当する場合は、ORA-22348が発生してALTER TYPE文は失敗します。
typeがエディションされたADTであり、ALTER TYPE文にtype_compile_clauseがない。
(ALTER TYPE文は、エディションされたオブジェクト型の再コンパイルには使用できますが、他の目的には使用できません。)
typeに依存するエディションされたADTが存在し、ALTER TYPE文にCASCADE句がある。
エディションされたオブジェクトは、エディション可能なオブジェクト型を持つスキーマ・オブジェクトであり、エディションが有効になっているユーザーによって作成されたものです。エディションされたオブジェクトの詳細は、『Oracle Database開発ガイド』を参照してください。
RESET
この型のバージョンを1に再設定し、進化の対象とみなされないようにします。
注意:
この型のバージョンを1に再設定すると、この型に依存するすべてのものが無効になります。
RESETは、所有者に対してエディションが有効にならないようにする進化したADT向けです。ユーザーに対するエディションの有効化の詳細は、『Oracle Database開発ガイド』を参照してください。
ADTのバージョン番号を確認するには、静的データ・ディクショナリ・ビュー*_TYPE_VERSIONSからVERSION#を選択します。次に例を示します。
SELECT Version# FROM DBA_TYPE_VERSIONS WHERE Owner = schema AND Name = 'type_name' AND Type = 'TYPE'
進化したADTでは、前述の問合せによってバージョン番号が異なる複数の行が戻されます。RESETは、バージョン番号が最大バージョン番号より小さい行をすべて削除して、その残りの行のバージョン番号を1に再設定します。「例14-11」を参照してください。
RESETの制限
型に表依存性がある場合は(直接か間接かにかかわらず)、RESETは指定できません。
{ EDITIONABLE | NONEDITIONABLE }
schemaでスキーマ・オブジェクト・タイプTYPEに対して後からエディションが有効化された場合に、型がエディション・オブジェクトまたは非エディション・オブジェクトのどちらになるかを指定します。デフォルト: EDITIONABLE。エディション・オブジェクトと非エディション・オブジェクトの変更の詳細は、『Oracle Database開発ガイド』を参照してください。
[NOT] INSTANTIABLE
この型のオブジェクト・インスタンスを構成できる場合は、INSTANTIABLEを指定します。
この型に対してコンストラクタ(デフォルトまたはユーザー定義)が存在しない場合は、NOT INSTANTIABLEを指定します。インスタンス化ができないメソッドを持つ型、および(継承、またはこの句で指定された)属性を持たない型には、これらのキーワードを指定する必要があります。
NOT INSTANTIABLEの制限
ユーザー定義型に表依存性がある場合は、そのユーザー定義型をINSTANTIABLEからNOT INSTANTIABLEに変更することはできません。
[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としてマークされます。
関連項目:
ADTの進化の詳細は、『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』を参照してください。
FINALの制限
型にサブタイプがある場合は、ユーザー定義型をNOT FINALからFINALに変更することはできません。
type_compile_clause
(デフォルト)型仕様部および型本体を再コンパイルします。
再コンパイル中、データベースによってコンパイラの永続的なスイッチ設定はすべて削除され、セッションから再度取得されて、コンパイル後に格納されます。この処理を回避するには、REUSE SETTINGSを指定します。
型の再コンパイル時にコンパイル・エラーが発生した場合は、データベースによってエラーが戻され、型は無効なままになります。関連付けられているコンパイラ・エラー・メッセージは、SQL*PlusコマンドSHOW ERRORSを使用して確認できます。
COMPILE
型に対する動作は、ファンクションに対する動作と同様です。「COMPILE」を参照してください。
DEBUG
型に対する動作は、ファンクションに対する動作と同様です。DEBUGを参照してください。
SPECIFICATION
型仕様部のみを再コンパイルします。
BODY
型本体のみを再コンパイルします。
compiler_parameters_clause
型に対する動作は、ファンクションに対する動作と同様です。詳細は、「ALTER FUNCTION」の「compiler_parameters_clause」を参照してください。
REUSE SETTINGS
型に対する動作は、ファンクションに対する動作と同様です。「REUSE SETTINGS」を参照してください。
type_replace_clause
メンバー・サブプログラム仕様部を追加します。
type_replace_clauseの制限
この句は、ADTに対してのみ有効です。ネストされた表やVARRAYには使用できません。
invoker_rights_clause
ADTのメンバー・ファンクションおよびプロシージャのAUTHIDプロパティを指定します。AUTHIDプロパティの詳細は、「実行者権限および定義者権限(AUTHIDプロパティ)」を参照してください。
invoker_rights_clauseの制限
この句は、ADTにのみ指定でき、ネストした表またはVARRAYには指定できません。
accessible_by_clause
型の変更時の動作はファンクションの作成時と同じです。CREATE FUNCTIONの「accessible_by_clause」を参照してください。
attribute
オブジェクト属性の名前。属性は、オブジェクトの構造を形成する、名前および型指定子を持つデータ項目です。
element_spec
再定義されたオブジェクトの要素を指定します。
inheritance_clauses
スーパータイプとサブタイプの間の関係を指定します。
subprogram_spec
ADT属性として参照されるサブプログラムを指定します。このようなサブプログラムには、それぞれの対応するメソッド本体をADT本体に指定する必要があります。
関連項目:
メンバー・メソッドと静的メソッドの違い、およびその例については、「CREATE TYPE文」を参照してください
パッケージ内のサブプログラム名のオーバーロードの詳細は、「オーバーロードされたサブプログラム」を参照してください
procedure_spec
プロシージャ・サブプログラムの仕様部。
function_spec
ファンクション・サブプログラムの仕様部。
restrict_references_pragma
非推奨の句です。「RESTRICT_REFERENCESプラグマ」を参照してください。
restrict_references_pragmaの制限
この句は、メソッドを削除する場合には無効です。
関連項目:
プラグマの詳細は、『Oracle Database開発ガイド』を参照してください。
map_order_function_spec
宣言するMEMBERまたはSTATICメソッドの数に関係なく、1つのMAPメソッドまたは1つのORDERメソッドを宣言できます。ただし、スーパータイプでNOT FINAL MAPメソッドを定義する場合は、サブタイプでMAPメソッドをオーバーライドできます。いずれかのメソッドを宣言すると、SQLでオブジェクト・インスタンスを比較できます。
いずれのメソッドも宣言しない場合、オブジェクト・インスタンスに関して比較できるのは等しいか等しくないかについてのみです。同じ型定義のインスタンスは、それぞれの対応する属性の各ペアが等しい場合にのみ等しくなります。2つのADTが等しいかどうかを判断するために、比較メソッドを指定しないでください。
MAP
MAPの場合は、オブジェクトのすべてのインスタンスの順序における特定のインスタンスの相対的な位置を戻すメンバー・ファンクション(MAPメソッド)を指定します。MAPメソッドは暗黙的にコールされ、オブジェクト・インスタンスを事前定義済のスカラー型の値にマップすることによって、それらのオブジェクト・インスタンスに順序を設定します。データベースでは、比較条件およびORDER BY句にこの順序が使用されます。
ソート(ORDER BY、GROUP BY、DISTINCTまたはUNION句を使用)または結合を含む問合せで型が参照される場合に、それらの問合せをパラレル化するには、MAPメンバー・ファンクションを指定する必要があります。
MAPメソッドの引数がNULLの場合は、MAPメソッドによってNULLが戻され、メソッドは起動されません。
オブジェクトの仕様部には1つのMAPメソッドのみを含めることができ、このメソッドはファンクションである必要があります。結果として生成される型は、事前定義済のSQLスカラー型である必要があり、MAPファンクションに指定できる引数は、暗黙的なSELF引数のみです。
サブタイプでは、新しいMAPメソッドを定義することはできませんが、継承されたMAPメソッドをオーバーライドすることはできます。
ORDER
ORDERの場合は、オブジェクトのインスタンスを明示的な引数および暗黙的なSELF引数として取り、負の整数、0(ゼロ)または正の整数のいずれかを戻すメンバー・ファンクション(ORDERメソッド)を指定します。負の値、0(ゼロ)または正の値は、暗黙的なSELF引数が明示的な引数より小さいか、等しいかまたは大きいことを示します。
ORDERメソッドのいずれかの引数がNULLの場合は、ORDERメソッドによってNULLが戻され、メソッドは起動されません。
同じADT定義のインスタンスをORDER BY句で比較すると、ORDERメソッド・ファンクションが起動されます。
オブジェクトの仕様部には1つのORDERメソッドのみを含めることができ、このメソッドは戻り型NUMBERを持つファンクションである必要があります。
サブタイプでは、ORDERメソッドを定義したり、継承されたORDERメソッドをオーバーライドしたりすることはできません。
alter_method_spec
型にメソッドを追加するか、型からメソッドを削除します。その型に依存するすべてのファンクション索引がデータベースによって無効にされます。
1つのALTER TYPE文で複数のメソッドを追加または削除できますが、各メソッドを参照できるのは1回のみです。
ADD
メソッドを追加する場合は、その名前が型階層内の既存の属性と競合しないようにする必要があります。
関連項目:
DROP
メソッドを削除すると、そのメソッドがターゲット型から削除されます。
DROPの制限
スーパータイプから継承されたメソッドをサブタイプから削除することはできません。かわりに、メソッドをスーパータイプから削除する必要があります。
subprogram_spec
MEMBERおよびSTATIC句を使用すると、ADTに対してプロシージャ・サブプログラムの追加または削除を行うことができます。
subprogram_specの制限
MEMBERメソッドをサブタイプ内で再定義するサブタイプに対してSTATICメソッドを定義することはできません。逆も同様です。
map_order_function_spec
MAPまたはORDERメソッドを宣言すると、オブジェクト・インスタンスをSQLで比較できます。
map_order_function_specの制限
サブタイプにORDERメソッドを追加することはできません。
alter_attribute_definition
ADTの属性を追加、削除または変更します。1つのALTER TYPE文で複数のメンバー属性またはメソッドを追加、削除または変更できますが、各属性またはメソッドを参照できるのは1回のみです。
ADD ATTRIBUTE
属性の名前は、型階層内の既存の属性またはメソッドと競合しないようにする必要があります。属性は、データベースによって、ローカルに定義された属性リストの最後に追加されます。
属性をスーパータイプに追加すると、すべてのサブタイプに継承されます。サブタイプでは、継承された属性は宣言された属性より常に優先されます。そのため、属性をスーパータイプに追加した後で、暗黙的に変更されたサブタイプのマッピングの更新が必要な場合があります。
関連項目:
DROP ATTRIBUTE
属性を型から削除すると、削除した属性に対応する列に加えて、削除した属性を参照している索引、統計および制約も削除されます。
削除する属性のデータ型を指定する必要はありません。
DROP ATTRIBUTEの制限
スーパータイプから継承された属性は削除できません。かわりに、属性をスーパータイプから削除する必要があります。
パーティション化キー、サブパーティション化キーまたはクラスタ・キーの一部となっている属性は削除できません。
注意:
INVALIDATEオプションを使用する場合、コンパイラは依存をチェックしないため、このルールは施行されません。ただし、そのような属性を削除すると、表は使用できない状態のままとなります。
オブジェクト表の主キー・ベースのオブジェクト識別子または索引構成表の主キーの属性は削除できません。
ルート型のすべての属性を削除することはできません。かわりに、ルート型を削除する必要があります。ただし、サブタイプのローカルに宣言されたすべての属性を削除することはできます。
MODIFY ATTRIBUTE
既存のスカラー属性のデータ型を変更します。たとえば、VARCHAR2またはRAW属性の長さを増やしたり、数値属性の精度または位取りを増やすことができます。
MODIFY ATTRIBUTEの制限
ファンクション・ベースの索引内、ドメイン索引内、またはクラスタ・キー内で参照される属性のサイズを拡張することはできません。
alter_collection_clauses
この句は、コレクション型に対してのみ有効です。
MODIFY LIMIT integer
VARRAYの要素の数を増やします。この句は、ネストした表に対しては無効です。VARRAYの要素の現在の最大数より大きい整数を指定します。
関連項目:
ELEMENT TYPEデータ型
VARRAYまたはネストした表のスカラー・データ型の精度、サイズまたは長さを増やします。この句は、ADTのコレクションに対しては無効です。
NUMBERのコレクションの場合は、精度または位取りを増やすことができます。
RAWのコレクションの場合は、最大サイズを増やすことができます。
VARCHAR2またはNVARCHAR2のコレクションの場合は、最大長を増やすことができます。
関連項目:
dependent_handling_clause
変更された型に依存するオブジェクトをデータベースで処理する方法を指定します。この句を省略すると、型に依存する型または表がある場合にALTER TYPE文が終了します。
INVALIDATE
チェック・メカニズムを使用しないで、すべての依存オブジェクトを無効にします。
注意:
データベースによって型の変更は検証されないため、この句は注意して使用してください。たとえば、パーティション化またはクラスタ・キーである属性を削除すると、表は使用できなくなります。
CASCADE
型の変更を依存する型および表に伝播します。FORCEも指定しないかぎり、依存する型または表でエラーが検出された場合は文が終了します。
型のプロパティをFINALとNOT FINALの間で変更する場合は、この句を指定して、依存する列および表のデータを変換する必要があります。「[NOT] FINAL」を参照してください。
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プロシージャを実行して、例外表が作成されている必要があります。
例
例14-5 メンバー・ファンクションの追加: 例
この例では、ADT data_typ1を使用します。このADTを作成する例については、「例14-18」を参照してください。メソッドが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;
/
例14-6 コレクション属性の追加: 例
この例では、author属性をtext表のtextdoc_tabオブジェクト列に追加します。基礎となるtextdoc_typ型を作成する例については、「例14-18」を参照してください。
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キーワードは必須です。
例14-7 コレクション型の要素の数の増加: 例
この例では、VARRAYphone_list_typ_demo内の要素の最大数を増やします。この型を作成する例については、「例14-18」を参照してください。
ALTER TYPE phone_list_typ_demo MODIFY LIMIT 10 CASCADE;
例14-8 コレクション型の長さの増加: 例
この例では、VARRAY要素型phone_list_typの長さを長くします。
ALTER TYPE phone_list_typ MODIFY ELEMENT TYPE VARCHAR(64) CASCADE;
例14-9 型の再コンパイル: 例
この例では、hrスキーマ内の型cust_address_typを再コンパイルします。
ALTER TYPE cust_address_typ2 COMPILE;
例14-10 型仕様部の再コンパイル: 例
この例では、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;
例14-11 ADTの進化とリセット: 例
この例では、スキーマUsr内にADTを作成し、そのADTを進化させてからUsrに対してエディションを有効にしようとしますが、失敗します。その後、ADTのバージョンを1に再設定すると、Usrに対するエディションが正常に有効になります。この例では、新しく作成し、進化させ、再設定したADTのバージョン番号を表示するために、静的データ・ディクショナリ・ビューDBA_TYPE_VERSIONSを使用します。
-- Create ADT in schema Usr: create type Usr.My_ADT authid Definer is object(a1 number) -- Show version number of ADT: select Version#||Chr(10)||Text t from DBA_Type_Versions where Owner = 'USR' and Type_Name = 'MY_ADT' /
結果:
T -------------------------------------------------------------------------------- 1 type My_ADT authid Definer is object(a1 number) 1 row selected. -- Evolve ADT: alter type Usr.My_ADT add attribute (a2 number) / -- Show version number of evolved ADT: select Version#||Chr(10)||Text t from DBA_Type_Versions where Owner = 'USR' and Type_Name = 'MY_ADT' /
結果:
T -------------------------------------------------------------------------------- 1 type My_ADT authid Definer is object(a1 number) 2 type My_ADT authid Definer is object(a1 number) 2 alter type My_ADT add attribute (a2 number) 3 rows selected. -- Try to enable editions for Usr: alter user Usr enable editions /
結果:
alter user Usr enable editions * ERROR at line 1: ORA-38820: user has evolved object type -- Reset version of ADT to 1: alter type Usr.My_ADT reset / -- Show version number of reset ADT: select Version#||Chr(10)||Text t from DBA_Type_Versions where Owner = 'USR' and Type_Name = 'MY_ADT' /
結果:
T -------------------------------------------------------------------------------- 1 type My_ADT authid Definer is object(a1 number) 1 alter type My_ADT add attribute (a2 number) 2 rows selected. -- Try to enable editions for Usr: alter user Usr enable editions /
結果:
User altered.