プライマリ・コンテンツに移動
Oracle Database PL/SQL言語リファレンス
12c リリース1 (12.1)
B71296-06
目次へ移動
目次
索引へ移動
索引

前
次

ALTER TYPE文

ALTER TYPE文は、「CREATE TYPE文」および「CREATE TYPE BODY文」で作成された型に対して次のいずれかを実行します。

  • 型を進化させます。つまり、メンバー属性またはメソッドを追加または削除します。

    型の進化の詳細は、『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』を参照してください。

  • オブジェクト・メンバーのサブプログラム仕様部を追加することによって、型の仕様部を変更します。

  • 型の仕様部または本体を再コンパイルします。

  • 型のバージョンを1に再設定し、進化の対象とみなされないようにします。

ここでのトピック

前提条件

型がSYSスキーマ内にある場合、SYSDBAとして接続する必要があります。そうでない場合は、型が自分のスキーマ内にあり、CREATE TYPEまたはCREATE ANY TYPEシステム権限を所有しているか、またはALTER ANY TYPEシステム権限を所有している必要があります。

構文

type_compile_clause ::=

compiler_parameters_clause::=

type_replace_clause ::=

「accessible_by_clause ::=」を参照してください。

invoker_rights_clause ::=

inheritance_clauses ::=

procedure_spec ::=

「call_spec ::=」を参照してください。

constructor_spec ::=

「call_spec ::=」を参照してください。

map_order_function_spec ::=

「function_spec ::=」を参照してください。

alter_attribute_definition::=

alter_collections_clauses::=

dependent_handling_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_clauseCASCADE句を指定して、依存する列および表のデータを変換する必要があります。具体的には、次のことに注意してください。

  • 型を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 FUNCTIONaccessible_by_clauseを参照してください。

attribute

オブジェクト属性の名前。属性は、オブジェクトの構造を形成する、名前および型指定子を持つデータ項目です。

element_spec

再定義されたオブジェクトの要素を指定します。

inheritance_clauses

スーパータイプとサブタイプの間の関係を指定します。

subprogram_spec

ADT属性として参照されるサブプログラムを指定します。このようなサブプログラムには、それぞれの対応するメソッド本体をADT本体に指定する必要があります。

関連項目:

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 BYGROUP BYDISTINCTまたは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

メソッドを追加する場合は、その名前が型階層内の既存の属性と競合しないようにする必要があります。

関連項目:

「例14-5」

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

属性の名前は、型階層内の既存の属性またはメソッドと競合しないようにする必要があります。属性は、データベースによって、ローカルに定義された属性リストの最後に追加されます。

属性をスーパータイプに追加すると、すべてのサブタイプに継承されます。サブタイプでは、継承された属性は宣言された属性より常に優先されます。そのため、属性をスーパータイプに追加した後で、暗黙的に変更されたサブタイプのマッピングの更新が必要な場合があります。

関連項目:

「例14-6」

DROP ATTRIBUTE

属性を型から削除すると、削除した属性に対応する列に加えて、削除した属性を参照している索引、統計および制約も削除されます。

削除する属性のデータ型を指定する必要はありません。

DROP ATTRIBUTEの制限

  • スーパータイプから継承された属性は削除できません。かわりに、属性をスーパータイプから削除する必要があります。

  • パーティション化キー、サブパーティション化キーまたはクラスタ・キーの一部となっている属性は削除できません。

    注意:

    INVALIDATEオプションを使用する場合、コンパイラは依存をチェックしないため、このルールは施行されません。ただし、そのような属性を削除すると、表は使用できない状態のままとなります。

  • オブジェクト表の主キー・ベースのオブジェクト識別子または索引構成表の主キーの属性は削除できません。

  • ルート型のすべての属性を削除することはできません。かわりに、ルート型を削除する必要があります。ただし、サブタイプのローカルに宣言されたすべての属性を削除することはできます。

MODIFY ATTRIBUTE

既存のスカラー属性のデータ型を変更します。たとえば、VARCHAR2またはRAW属性の長さを増やしたり、数値属性の精度または位取りを増やすことができます。

MODIFY ATTRIBUTEの制限

ファンクション・ベースの索引内、ドメイン索引内、またはクラスタ・キー内で参照される属性のサイズを拡張することはできません。

alter_collection_clauses

この句は、コレクション型に対してのみ有効です。

MODIFY LIMIT integer

VARRAYの要素の数を増やします。この句は、ネストした表に対しては無効です。VARRAYの要素の現在の最大数より大きい整数を指定します。

関連項目:

「例14-7」

ELEMENT TYPEデータ型

VARRAYまたはネストした表のスカラー・データ型の精度、サイズまたは長さを増やします。この句は、ADTのコレクションに対しては無効です。

  • NUMBERのコレクションの場合は、精度または位取りを増やすことができます。

  • RAWのコレクションの場合は、最大サイズを増やすことができます。

  • VARCHAR2またはNVARCHAR2のコレクションの場合は、最大長を増やすことができます。

    関連項目:

    「例14-8」

dependent_handling_clause

変更された型に依存するオブジェクトをデータベースで処理する方法を指定します。この句を省略すると、型に依存する型または表がある場合にALTER TYPE文が終了します。

INVALIDATE

チェック・メカニズムを使用しないで、すべての依存オブジェクトを無効にします。

注意:

データベースによって型の変更は検証されないため、この句は注意して使用してください。たとえば、パーティション化またはクラスタ・キーである属性を削除すると、表は使用できなくなります。

CASCADE

型の変更を依存する型および表に伝播します。FORCEも指定しないかぎり、依存する型または表でエラーが検出された場合は文が終了します。

型のプロパティをFINALNOT FINALの間で変更する場合は、この句を指定して、依存する列および表のデータを変換する必要があります。「[NOT] FINAL」を参照してください。

INCLUDING TABLE DATA

(デフォルト)すべてのユーザー定義列に格納されているデータを最新バージョンの列型に変換します。

注意:

列データがOracle Databaseバージョン8.0のイメージ・フォーマットの場合は、この句を指定する必要があります。この句は、型のプロパティをFINALNOT 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.