14.6 ALTER TYPE文
ALTER TYPE文を使用すると、メンバー属性またはメソッドを追加または削除できます。オブジェクト型の既存のプロパティを変更できます。また、その型のスカラー属性を変更できます。この文を使用すると、新しいオブジェクト・メンバーのサブプログラム仕様を追加することによって、型の仕様部または本体を再コンパイルしたり、オブジェクト型の仕様を変更することができます。
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 ::=, type_replace_clause ::=, alter_attribute_definition ::=, alter_method_spec ::=, alter_collections_clauses::=, dependent_handling_clause ::= )
type_replace_clause ::=
( accessible_by_clause ::=, invoker_rights_clause ::=, element_spec ::=)
alter_method_spec ::=
alter_attribute_definition ::=
alter_collections_clauses::=
dependent_handling_clause ::=
exceptions_clause::=
セマンティクス
alter_type
IF EXISTS
型が存在する場合は、型に対してalter_type_clauseで指定されたアクションを実行します。このような型が存在しない場合、文はエラーなしで無視されます。
schema
型が含まれているスキーマの名前。デフォルト: 自分のスキーマ。
type_name
ADT、VARRAY型、またはネストした表型の名前。
type_nameの制限
エディション化したADTを進化させることはできません。
次のいずれかに該当する場合は、ORA-22348が発生してALTER TYPE文は失敗します。
-
typeがエディションされたADTであり、
ALTERTYPE文にtype_compile_clauseがない。(
ALTERTYPE文は、エディションされたオブジェクト型の再コンパイルには使用できますが、他の目的には使用できません。) -
typeに依存するエディションされたADTが存在し、
ALTERTYPE文にCASCADE句がある。
エディションされたオブジェクトは、エディション可能なオブジェクト型を持つスキーマ・オブジェクトであり、エディションが有効になっているユーザーによって作成されたものです。
{ EDITIONABLE | NONEDITIONABLE }
schemaでスキーマ・オブジェクト・タイプTYPEに対して後からエディションが有効化された場合に、型がエディション・オブジェクトまたは非エディション・オブジェクトのどちらになるかを指定します。デフォルト: EDITIONABLE。エディション・オブジェクトと非エディション・オブジェクトの変更の詳細は、『Oracle Database開発ガイド』を参照してください。
alter_type_clause
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に再設定します。
RESETの制限
型に表依存性がある場合は(直接か間接かにかかわらず)、RESETは指定できません。
[NOT] INSTANTIABLE
この型のオブジェクト・インスタンスを構成できる場合は、INSTANTIABLEを指定します。
この型に対してコンストラクタ(デフォルトまたはユーザー定義)が存在しない場合は、NOT INSTANTIABLEを指定します。インスタンス化ができないメソッドを持つ型、および(継承、またはこの句で指定された)属性を持たない型には、これらのキーワードを指定する必要があります。
NOT INSTANTIABLEの制限
ユーザー定義型に表依存性がある場合は、そのユーザー定義型をINSTANTIABLEからNOT INSTANTIABLEには変更できません。
[NOT] FINAL
この型に対してサブタイプをさらに作成できないようにする場合は、FINALを指定します。
この型に対してサブタイプをさらに作成できるようにする場合は、NOT FINALを指定します。
プロパティをFINALからNOT FINALに、またはその逆に変更する場合は、"dependent_handling_clause"のCASCADE句を指定して、依存する列および表のデータを変換する必要があります。具体的には次のとおりです。
-
型を
NOTFINALからFINALに変更する場合は、CASCADE[INCLUDINGTABLEDATA]を指定する必要があります。CASCADENOTINCLUDINGTABLEDATAを指定してデータ変換を遅延させることはできません。 -
型を
FINALからNOTFINALに変更する場合は、次の操作を実行します。-
その型の置換可能な表と列を作成する場合は、
CASCADEINCLUDINGTABLEDATAを指定します。ただし、既存の依存する表および列の置換可能性を考慮しない場合です。既存のすべての依存する列および表が
NOTSUBSTITUTABLEATALLLEVELSとしてマークされるため、変更した型のサブタイプ・インスタンスをこれらの既存の列と表に挿入することはできません。 -
その型の置換可能な表と列を作成し、既存の依存する表および列に変更された型のサブタイプ・インスタンスを格納する場合は、
CASCADECONVERTTOSUBSTITUTABLEを指定します。明示的に
NOTSUBSTITUTABLEATALLLEVELSとマークされたものを除いて、既存のすべての依存する列と表がSUBSTITUTABLEATALLLEVELSとしてマークされます。関連項目:
ADTの進化の詳細は、『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』を参照してください。
-
FINALの制限
型にサブタイプがある場合は、ユーザー定義型をNOT FINALからFINALには変更できません。
type_compile_clause
(デフォルト)型仕様部および型本体を再コンパイルします。
compile_clauseおよびcompiler_parameters_clauseのセマンティクスを参照してください。type_replace_clause
Oracle Database 12cリリース2 (12.2)以降、type_replace_clauseは非推奨となりました。かわりにalter_method_spec句を使用してください。または、CREATE OR REPLACE TYPE文を使用して型を再作成することもできます。
メンバー・サブプログラム仕様部を追加します。
type_replace_clauseの制限
この句は、ADTに対してのみ有効です。ネストされた表やVARRAYには使用できません。
attribute
オブジェクト属性の名前。属性は、オブジェクトの構造を形成する、名前および型指定子を持つデータ項目です。
element_spec
再定義されたオブジェクトの要素を指定します。
alter_method_spec
型にメソッドを追加するか、型からメソッドを削除します。その型に依存するすべてのファンクション索引がデータベースによって無効にされます。
1つのALTER TYPE文で複数のメソッドを追加または削除できますが、各メソッドを参照できるのは1回のみです。
ADD
メソッドを追加する場合は、その名前が型階層内の既存の属性と競合しないようにする必要があります。
DROP
メソッドを削除すると、そのメソッドがターゲット型から削除されます。
DROPの制限
スーパータイプから継承されたメソッドをサブタイプから削除することはできません。かわりに、メソッドをスーパータイプから削除する必要があります。
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の要素の現在の最大数より大きい整数を指定します。
MODIFY ELEMENT TYPE datatype
VARRAYまたはネストした表のスカラー・データ型の精度、サイズまたは長さを増やします。この句は、ADTのコレクションに対しては無効です。
-
NUMBERのコレクションの場合は、精度または位取りを増やすことができます。 -
RAWのコレクションの場合は、最大サイズを増やすことができます。 -
VARCHAR2またはNVARCHAR2のコレクションの場合は、最大長を増やすことができます。
dependent_handling_clause
変更された型に依存するオブジェクトをデータベースで処理する方法を指定します。この句を省略すると、型に依存する型または表がある場合にALTER TYPE文が終了します。
INVALIDATE
チェック・メカニズムを使用しないで、すべての依存オブジェクトを無効にします。Oracle Database 12cリリース2 (12.2)以降、INVALIDATEコマンドは非推奨となりました。かわりにCASCADE句を使用することをお薦めします。
注意:
データベースによって型の変更は検証されないため、この句は注意して使用してください。たとえば、パーティション化またはクラスタ・キーである属性を削除すると、表は使用できなくなります。
CASCADE
型の変更を依存する型および表に伝播します。FORCEも指定しないかぎり、依存する型または表でエラーが検出された場合は文が終了します。
型のプロパティをFINALとNOT FINALの間で変更する場合は、この句を指定して、依存する列および表のデータを変換する必要があります。
INCLUDING TABLE DATA
(デフォルト)すべてのユーザー定義列に格納されているデータを最新バージョンの列型に変換します。
ノート:
列データがOracle Databaseバージョン8.0のイメージ・フォーマットの場合は、この句を指定する必要があります。この句は、型のプロパティをFINALとNOT FINALの間で変更する場合も必須です。
-
列型に追加された属性ごとに、データベースによってデータに属性が追加され、NULLに初期化されます。
-
参照される型から削除された属性ごとに、対応する属性データが表の各行から削除されます。
INCLUDING TABLE DATAを指定する場合は、表データを含むすべての表領域が読取り/書込みモードである必要があります。
NOT INCLUDING TABLE DATAを指定すると、データベースによって列のメタデータがアップグレードされ、その型に対する変更が反映されますが、このALTER TYPE文の一部として依存する列はスキャンされず、データは更新されません。ただし、依存する列データはアクセス可能なままであり、後続のデータの問合せ結果には型の変更が反映されます。
CONVERT TO SUBSTITUTABLE
FINALからNOT FINALへの型の変更、その型の置換可能な表と列の作成、および既存の依存する表と列への変更した型のサブタイプ・インスタンスの格納も行う場合は、この句を指定します。
exceptions_clause
FORCE
依存する表および索引からのエラーを無視し、指定した例外表にすべてのエラーを記録する場合は、FORCEを指定します。DBMS_UTILITY.CREATE_ALTER_TYPE_ERROR_TABLEプロシージャを実行して、例外表が作成されている必要があります。
例
これらの例で参照される型の作成例は、「CREATE TYPE文」を参照してください。
例14-7 メンバー・ファンクションの追加
この例では、ADT 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;
/例14-8 コレクション属性の追加
この例では、author属性をtext表のtextdoc_tabオブジェクト列に追加します。
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-9 コレクション型の要素の数の増加
この例では、VARRAYphone_list_typ_demo内の要素の最大数を増やします。
ALTER TYPE phone_list_typ_demo MODIFY LIMIT 10 CASCADE;
例14-10 コレクション型の長さの増加
この例では、VARRAY要素型phone_list_typの長さを長くします。
ALTER TYPE phone_list_typ MODIFY ELEMENT TYPE VARCHAR(64) CASCADE;
例14-11 型の再コンパイル
この例では、hrスキーマ内の型cust_address_typを再コンパイルします。
ALTER TYPE cust_address_typ2 COMPILE;
例14-12 型仕様部の再コンパイル
この例では、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-13 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.関連トピック
この章:
その他のドキュメント:
-
エディションの詳細は、『Oracle Database開発ガイド』を参照してください。
-
プラグマの詳細は、『Oracle Database開発ガイド』を参照してください。
-
型属性の変更時に表データを含めない場合の影響の詳細は、『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』を参照してください。








