7.3 オブジェクト型のシノニム

表、ビューおよびその他の様々なスキーマ・オブジェクトについてシノニムが作成できるように、オブジェクト型についてもシノニムを定義できます。

型のシノニムは、他の種類のスキーマ・オブジェクトのシノニムと同じ利点があり、基礎となるスキーマ・オブジェクトを場所に依存せずに参照する手段となります。パブリック・タイプのシノニムを使用するアプリケーションは、データベースのスキーマを変更せずにデプロイでき、スキーマの名前で型の名前を修飾する必要はありません。

関連項目:

シノニムの詳細は、『Oracle Database管理者ガイド』を参照してください。

内容は次のとおりです。

7.3.1 型のシノニムの作成

型のシノニムは、CREATE SYNONYM文で作成します。

ユーザーには、CREATE SYNONYMおよびCREATE PUBLIC SYNONYM権限を付与しておく必要があります。

たとえば、これらの文はtyp1型を作成し、次にこの型のシノニムを作成します。

例7-11 user1のCREATE TYPE / SYNONYM

-- Example requires Ex.7-1 which created user1 and granted it the CREATE SYNONYM
-- and CREATE PUBLIC SYNONYM privileges
-- connect as user1 if not already connected.

CREATE TYPE typ1 AS OBJECT (x number);
/
CREATE SYNONYM syn1 FOR typ1;

シノニムは、コレクション型についても作成できます。次の例は、ネストした表型のシノニムを作成します。

CREATE TYPE typ2 AS TABLE OF NUMBER;
/
CREATE SYNONYM syn2 FOR typ2;

パブリック・シノニムは、PUBLICキーワードを使用して作成します。

CREATE TYPE shape AS OBJECT ( name VARCHAR2(10) );
/
CREATE PUBLIC SYNONYM pub_shape FOR shape;

REPLACEオプションを使用すると、シノニムが指す基礎となる型を別の型に変更できます。たとえば、次の文は、syn1が指す型をtyp2型に変更します。

CREATE OR REPLACE SYNONYM syn1 FOR typ2;

7.3.2 型のシノニムの使用

型のシノニムは、型を参照できるすべての場所で使用できます。たとえば、DDL文の中で型のシノニムを使用して、表列の型または型属性を指定できます。

例7-12では、シノニムsyn1を使用して、属性の型をtyp3型に指定します。

例7-12 CREATE文での型のシノニムの使用

-- Requires Ex 7-1 and connection as user1
-- drop syn1 and typ1 if created for Ex. 7-12
CREATE TYPE typ1 AS OBJECT (x number);
/
CREATE SYNONYM syn1 FOR typ1;

CREATE TYPE typ3 AS OBJECT ( a syn1 );
/

次の文で、型のシノニムsyn1は、syn1をシノニムとするオブジェクト型typ1のコンストラクタをコールします。この文は、typ1のオブジェクト・インスタンスを戻します。

SELECT syn1(0) FROM dual;

次の例は、syn2がネストした表型のシノニムです。シノニムは、CAST式の実際の型の名前と置き換わります。

SELECT CAST(MULTISET(SELECT eno FROM USER3.EMP) AS syn2) FROM dual;

このコードは、次の出力を戻します。

SQL> -- Type synonym used to call a constructor / nested table
SELECT syn1(0) FROM dual;
SELECT CAST(MULTISET(SELECT eno FROM USER3.EMP) AS syn2) FROM
dual;
SQL> SYN1(0)(X)
----------------------------------------------------------------
TYP1(0)
SQL>
CAST(MULTISET(SELECTENOFROMUSER3.EMP)ASSYN2)
----------------------------------------------------------------
TYP2()

型のシノニムは、次のような文で使用できます。

  • DML文: SELECTINSERTUPDATEDELETEFLASHBACK TABLEEXPLAIN PLANおよびLOCK TABLE

  • DDL文: AUDITNOAUDITGRANTREVOKEおよびCOMMENT

7.3.2.1 シノニムを使用するスキーマ・オブジェクトの記述

型のシノニムを使用して型または表が作成されると、DESCRIBEコマンドにより、型が表すシノニムが表示されます。

カタログ・ビューUSER_SYNONYMSを問い合せると、型のシノニムの基礎となる型を確認できます。

  • DESCRIBEコマンドを使用してシノニムが表す型ではなく、シノニムを表示します。

同様に、型の名前を示すカタログ・ビュー(USER_TYPE_ATTRSなど)には、型のシノニムの名前が表示されます。

関連項目:

データ・ディクショナリ・カタログ・ビューの完全リストは、『Oracle Databaseリファレンス』の第2章を参照してください。

7.3.2.2 型のシノニムへの依存

型の宣言でシノニムを直接的または間接的に参照する型は、そのシノニムに依存します。したがって、例7-12の次の行に示す型typ3は、シノニムsyn1に依存する型です。

CREATE TYPE typ3 AS OBJECT ( a syn1 );
/

DDL文でシノニムを参照する他の種類のスキーマ・オブジェクトも、これらのシノニムに依存します。型のシノニムに依存するオブジェクトは、シノニムとシノニムの基礎になる型のどちらにも依存します。

シノニムの依存関係によって、シノニムが削除できるかどうか、または名前が変更できるかどうかが決まります。また、依存スキーマ・オブジェクトも、シノニムに対する操作の影響を受けます。次の項では、これらの様々な影響について説明します。

7.3.2.3 型のシノニムを置換する際の制限事項

シノニムに依存表または有効なユーザー定義型が存在しない場合にのみ、シノニムは置換できます。シノニムを置換することは、シノニムを削除してから、同じ名前で新しいシノニムを再作成することと同等です。

7.3.2.4 型のシノニムの削除

例7-13のように、シノニムはDROP SYNONYM文で削除します。

例7-13 型のシノニムの削除

CREATE SYNONYM syn4 FOR typ1;

DROP SYNONYM syn4;

型のシノニムに依存表または有効なオブジェクト型がある場合、型のシノニムを削除するには、FORCEオプションが必要です。FORCEオプションは、列の実際の型が削除された場合と同様に、直接的または間接的にシノニムに依存する列を、未使用とマークします。(たとえば、シノニムを使用して、列の宣言された型の属性の型を指定すると、列は間接的にそのシノニムに依存します。)

削除されたシノニムに依存するすべてのスキーマ・オブジェクトは無効になります。これらのスキーマ・オブジェクトは、削除されたシノニムと同じ名前のローカル・オブジェクトまたは新しいパブリック・シノニムを作成することで、再検証できます。

型のシノニムの基礎となるベース型の削除は、シノニムの削除と同じ結果を依存オブジェクトにもたらします。

7.3.2.5 型のシノニムの名前変更

型のシノニムの名前は、RENAME文で変更します。シノニムの名前を変更することは、シノニムを削除してから、新しい名前でシノニムを再作成することと同等です。型のシノニムに依存表または有効なオブジェクト型が存在する場合、型のシノニムの名前は変更できません。syn1には依存するオブジェクト型が存在するため、次の例は失敗します。

RENAME syn1 TO syn3 -- invalid statement;

7.3.2.6 型のパブリック・シノニムおよびローカル・スキーマ・オブジェクト

パブリック・シノニムが、新しいスキーマ・オブジェクトを保持するローカル・スキーマに依存表または有効なオブジェクト型を持っている場合、そのパブリック・シノニムと同じ名前のローカル・スキーマ・オブジェクトは作成できません。また、同じスキーマ内のプライベート・スキーマと同じ名前のローカル・スキーマ・オブジェクトも作成できません。

たとえば、次の例では、表shape_tabは、型の定義でパブリック・シノニムpub_shapeを使用する列があるため、このシノニムの依存表です。したがって、依存表と同じスキーマにパブリック・シノニムpub_shapeと同じ名前の表を作成しようとすると、失敗します。

-- Following uses public synonym pub_shape
CREATE TABLE shape_tab ( c1 pub_shape );
-- Following is not allowed
CREATE TABLE pub_shape ( c1 NUMBER ) -- invalid statement;