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文:
SELECT
、INSERT
、UPDATE
、DELETE
、FLASHBACK
TABLE
、EXPLAIN
PLAN
およびLOCK
TABLE
-
DDL文:
AUDIT
、NOAUDIT
、GRANT
、REVOKE
および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;