13.22 DEPRECATEプラグマ

DEPRECATEプラグマは、PL/SQL要素を非推奨としてマークします。コンパイラは、DEPRECATEプラグマまたは非推奨要素の使用に対して警告を発行します。

関連付けられた警告は非推奨要素のユーザーに対して、非推奨化が原因で他のコードの変更が必要になる可能性があることを示します。

構文

deprecate_pragma ::=

セマンティクス

deprecate_pragma

DEPRECATEプラグマは、パッケージ仕様部、オブジェクト仕様部、最上位プロシージャまたは最上位ファンクションの宣言セクションにのみ記述できます。

次の種類のPL/SQL要素を非推奨にすることができます。
  • サブプログラム

  • パッケージ

  • 変数

  • 定数

  • サブタイプ

  • 例外

  • カーソル

DEPRECATEプラグマは、PL/SQLユニットの宣言セクションにのみ記述できます。非推奨になる項目の宣言の直後に記述する必要があります。

DEPRECATEプラグマは、プラグマに先行する宣言で指定されたPL/SQL要素に適用されます。

DEPRECATEプラグマがパッケージ仕様部、オブジェクト仕様部またはサブプログラムに適用される場合、定義の宣言部分を終了させるキーワードISまたはASの直後にプラグマを記述する必要があります。

DEPRECATEプラグマがパッケージ仕様部またはオブジェクト仕様部に適用される場合、仕様部で宣言されたすべての要素(非推奨化できる種類のもの)への参照も非推奨になります。

DEPRECATEプラグマがサブプログラムの宣言に適用される場合、そのサブプログラムのみが影響を受けます。同じ名前の他のオーバーロードは非推奨になりません。

DEPRECATEプラグマの使用においてオプションのカスタム・メッセージを記述すると、非推奨要素への参照に対して発行される警告にカスタム・メッセージが追加されます。

DEPRECATEプラグマ内の識別子は、そのプラグマが適用される宣言内の要素を指定する必要があります。

非推奨化は、型の導出中に継承されます。親が非推奨になった子オブジェクト型は非推奨になりません。継承された属性およびメソッドのみが非推奨になります。

ベース型が非推奨にならず、個々のメソッドまたは属性が非推奨になり、型がこの型から導出され、非推奨になった型またはメソッドが継承される場合、導出された型からこれらを参照すると、コンパイラによって警告が発行されます。

非推奨化プラグマまたはその本体があるユニット以外の場所に記述されている非推奨要素への参照があると、PL/SQLコンパイラは参照された要素に関する警告を発行します。無名ブロック内の非推奨要素への参照があっても、コンパイラは警告を発行しません。名前付きエンティティ内の参照にかぎり、警告が発生します。

非推奨になったエンティティが非推奨になった他のエンティティの定義内で参照された場合、警告は発生しません。

古いクライアント・コードが非推奨になった要素を参照すると、そのコードは無効になり、再コンパイルされます。警告は発生しません。

SQLコードが非推奨要素を直接参照しても影響はありません。

PL/SQLの静的SQL文内の非推奨要素への参照があると、PL/SQLコンパイラが警告を発行する場合があります。ただし、そのような参照は検出できない可能性があります。

pls_identifier

非推奨になるPL/SQL要素の識別子。

character_literal

オプションのコンパイル時の警告メッセージ。

DEPRECATEプラグマによるコンパイルの警告

PL/SQLコンパイラは、DEPRECATEプラグマが使用されている場合、かつ非推奨になった項目が参照された場合に警告を発行します。

  • 6019 — このエンティティは非推奨になりました。今後のリリースで削除される可能性があります。非推奨になったエンティティは使用しないでください。

  • 6020 — 参照されたエンティティは非推奨になりました。今後のリリースで削除される可能性があります。非推奨になったエンティティは使用しないでください。警告に特定の指示がある場合は、それに従ってください。

  • 6021 — プラグマの置き間違い。プラグマDEPRECATEは、非推奨になるエンティティの宣言の直後に続ける必要があります。非推奨になるエンティティの宣言の直後にプラグマを置いてください。

  • 6022 — このエンティティを非推奨にすることはできません。非推奨化が適用されるのは、パッケージ仕様部または型仕様部で宣言できるエンティティ、ならびに最上位のプロシージャおよびファンクション定義に限定されます。プラグマを削除してください。

DEPRECATEプラグマの警告は、PLSQL_WARNINGSパラメータまたはDBMS_WARNINGパッケージを使用して管理できます。

例13-9 非推奨化の警告の有効化

この例は、PLSQL_WARNINGSパラメータを設定して、セッションでこれらの警告を有効にする方法を示しています。

Live SQL:

この例は、Oracle Live SQLの「同じスキーマの最上位プロシージャへのアクセスの制限」で表示および実行できます

ALTER SESSION SET PLSQL_WARNINGS='ENABLE:(6019,6020,6021,6022)';

例13-10 PL/SQLパッケージの非推奨化

この例は、PL/SQLパッケージ全体の非推奨化を示しています。警告は、パッケージpack1へのすべての参照に対して、ならびにパッケージおよびその本体の外部で使用されたプロシージャfooおよびbarに対して発行されます。

Live SQL:

この例は、Oracle Live SQLの「PL/SQLパッケージの非推奨化」で表示および実行できます

PACKAGE pack1 AS
PRAGMA DEPRECATE(pack1);
 PROCEDURE foo;
 PROCEDURE bar;
END pack1;

例13-11 カスタム警告によるPL/SQLパッケージの非推奨化

この例は、PL/SQLパッケージの非推奨化を示します。非推奨になったプロシージャfooに対する参照が別のユニットでコンパイルされると、コンパイラはカスタム警告メッセージを発行します。

Live SQL:

この例は、Oracle Live SQLの「カスタム警告によるPL/SQLパッケージの非推奨化」で表示および実行できます

PACKAGE pack5 AUTHID DEFINER AS
PRAGMA DEPRECATE(pack5 , ’Package pack5 has been deprecated, use new_pack5 instead.’);
 PROCEDURE foo;
 PROCEDURE bar;
END pack5;

別のユニットでプロシージャpack5.fooへの参照があると、次のような警告が発生します。

SP2-0810: Package Body created with compilation warnings

Errors for PACKAGE BODY PACK6:
4/10     PLW-06020: reference to a deprecated entity: PACK5 declared in unit PACK5[1,9].  
         Package pack5 has been deprecated, use new_pack5 instead

例13-12 PL/SQLプロシージャの非推奨化

この例は、パッケージpack7内の単一のPL/SQLプロシージャfooの非推奨化を示しています。

Live SQL:

この例は、Oracle Live SQLの「PL/SQLプロシージャの非推奨化」で表示および実行できます

PACKAGE pack7 AUTHID DEFINER AS
  PROCEDURE foo;
  PRAGMA DEPRECATE (foo, ’pack7.foo is deprecated, use pack7.bar instead.’);
  PROCEDURE bar;
END pack7;

例13-13 オーバーロードされたプロシージャの非推奨化

この例は、DEPRECATEプラグマがプロシージャ名の特定のオーバーロードのみに適用されることを示しています。proc1の2番目の宣言のみが非推奨になります。

Live SQL:

この例は、Oracle Live SQLの「オーバーロードされたプロシージャの非推奨化」で表示および実行できます

PACKAGE pack2 AS
  PROCEDURE proc1(n1 NUMBER, n2 NUMBER, n3 NUMBER);
  -- Only the overloaded procedure with 2 arguments is deprecated
  PROCEDURE proc1(n1 NUMBER, n2 NUMBER);
      PRAGMA DEPRECATE(proc1);
 END pack2;

例13-14 定数と例外の非推奨化

Live SQL:

この例は、Oracle Live SQLの「定数と例外の非推奨化」で表示および実行できます

この例では、定数と例外の非推奨化を示します。

PACKAGE trans_data AUTHID DEFINER AS
   TYPE Transrec IS RECORD (
     accounttype VARCHAR2(30) ,
     ownername VARCHAR2(30) ,
     balance REAL
   );
   min_balance constant real := 10.0;
   PRAGMA DEPRECATE(min_balance , ’Minimum balance requirement has been removed.’);
   insufficient_funds EXCEPTION;
   PRAGMA DEPRECATE (insufficient_funds , ’Exception no longer raised.’);
END trans_data;

例13-15 条件付きコンパイルを使用した一部のデータベース・リリースでのエンティティの非推奨化

この例は、データベース・リリース・バージョンが11より後の場合のプロシージャproc1の非推奨化を示しています。

CREATE PACKAGE pack11 AUTHID DEFINER AS
 $IF DBMS_DB_VERSION.VER_LE_11 
 $THEN
    PROCEDURE proc1;
 $ELSE
    PROCEDURE proc1;
    PRAGMA DEPRECATE(proc1);
 $END
 PROCEDURE proc2;
 PROCEDURE proc3;
END pack11;

例13-16 オブジェクト型の非推奨化

この例は、オブジェクト型全体の非推奨化を示しています。

Live SQL:

この例は、Oracle Live SQLの「オブジェクト型の非推奨化」で表示および実行できます

TYPE type01 AS OBJECT(
   PRAGMA DEPRECATE (type01), 
   y NUMBER, 
   MEMBER PROCEDURE proc(x NUMBER), 
   MEMBER PROCEDURE proc2(x NUMBER) 
);

例13-17 オブジェクト型仕様部のメンバー・ファンクションの非推奨化

この例は、オブジェクト型仕様部のメンバー・ファンクションadd2の非推奨化を示しています。

Live SQL:

この例は、Oracle Live SQLの「オブジェクト型仕様部のメンバー・ファンクションの非推奨化」で表示および実行できます

TYPE objdata AS OBJECT(
  n1 NUMBER ,
  n2 NUMBER ,
  n3 NUMBER ,
  MEMBER FUNCTION add2 RETURN NUMBER ,
   PRAGMA DEPRECATE (add2),
  MEMBER FUNCTION add_all RETURN NUMBER
 );

例13-18 継承されたオブジェクト型の非推奨化

この例は、ユニットtype15_basetypeの型本体で宣言された、非推奨になったエンティティxへの参照があると、コンパイラが警告を発行することを示しています。

Live SQL:

この例は、Oracle Live SQLの「継承されたオブジェクト型の非推奨化」で表示および実行できます

TYPE type15_basetype AS OBJECT 
( 
  x1 NUMBER, 
  x  NUMBER, 
  PRAGMA DEPRECATE (x), 
  MEMBER PROCEDURE f0 , 
  PRAGMA DEPRECATE (f0), 
  MEMBER PROCEDURE f1 ,
  PRAGMA DEPRECATE (f1),
  MEMBER PROCEDURE f2 ,
  PRAGMA DEPRECATE (f2),
  MEMBER PROCEDURE f3) NOT FINAL;
TYPE BODY type15_basetype AS 
   MEMBER PROCEDURE f0 
   IS 
   BEGIN 
     x := 1; 
   END; 
   MEMBER PROCEDURE f1 
   IS 
   BEGIN 
     x := 1; 
   END; 

   MEMBER PROCEDURE f2
   IS
   BEGIN
     x := 1;
   END;

   MEMBER PROCEDURE f3
   IS
   BEGIN
     x := 1;
   END;
END;

type15_basetypeの型本体の非推奨になったエンティティx、f0およびf2への参照があると、コンパイラが警告を発行します。

TYPE type15_subtype UNDER type15_basetype ( 
  y NUMBER , 
  MEMBER PROCEDURE f1(z NUMBER), 
  MEMBER PROCEDURE f1(z NUMBER , m1 NUMBER), 
  PRAGMA DEPRECATE(f1), 
  OVERRIDING MEMBER PROCEDURE f2 
);
TYPE BODY type15_subtype AS 
   MEMBER PROCEDURE f1(z NUMBER)
IS 
BEGIN 
  -- deprecation attribute inherited in derived type. 
  x := 1;
  x1:= 2; 
  SELF.f0; 
END; 

   MEMBER PROCEDURE f1(z  NUMBER , 
                    m1 NUMBER) 
   IS 
   BEGIN 
     NULL; 
   END; 
   OVERRIDING MEMBER PROCEDURE f2 
   IS 
   BEGIN 
     /* refer to deprecated f2 in supertype */ 
     (SELF AS type15_basetype).f2; 
     /* No warning for a reference to a not deprecated data member in the supertype */ 
     x1 := 1; 
   END; 
END;

ユニットtype15_basetypeの非推奨になったエンティティx、f1およびf0への参照があると、コンパイラが警告を発行します。

PROCEDURE test_types3 
AS 
  e type15_subtype ; 
  d type15_basetype ; 
BEGIN 
  e := type15_subtype (1 ,1 ,1); 
  d := type15_basetype (1, 1); 
  d.x := 2; -- warning issued 
  d.f1;     -- warning issued 
  e.f1 (4); -- overloaded in derived type. no warning. not deprecated in the derived type. 
  e.f1 (1); -- no warning  
  e.f0;     -- f0 is deprecated in base type. deprecation is inherited. warning issued 
            -- warning issued for deprecated x in d.x and e.x 

  DBMS_OUTPUT.PUT_LINE(to_char(e.x) || to_char(' ') || to_char(d.x)); 

END;

例13-19 最上位のサブプログラムのみに適用される非推奨化

この例は、DEPRECATEプラグマを使用して、ネストしたプロシージャを非推奨化できないことを示しています。コンパイラは、エンティティでのプラグマの誤用について警告を発行します。プラグマによる影響はありません。

Live SQL:

この例は、Oracle Live SQLの「最上位のサブプログラムのみに適用される非推奨化」で表示および実行できます

PROCEDURE foo
IS
   PROCEDURE inner_foo
   IS
   PRAGMA DEPRECATE (inner_foo, 'procedure inner_foo is deprecated');
   BEGIN
     DBMS_OUTPUT.PUT_LINE('Executing inner_foo');
   END;
BEGIN
  DBMS_OUTPUT.PUT_LINE('Executing foo');
END; 

例13-20 DEPRECATEプラグマの置き間違い

DEPRECATEプラグマは、非推奨になる項目の宣言の直後に記述する必要があります。プラグマの置き間違いに関する警告が発行され、プラグマによる影響はありません。

Live SQL:

この例は、Oracle Live SQLの「DEPRECATEプラグマの置き間違い」で表示および実行できます

PROCEDURE bar
IS
BEGIN
   PRAGMA DEPRECATE(bar);
   DBMS_OUTPUT.PUT_LINE('Executing bar.');
END;

例13-21 要素名とDEPRECATEプラグマの引数の不一致

この例は、プラグマの引数が宣言内の名前と一致しない場合、プラグマが無視され、コンパイラによる警告の発行がないことを示しています。

Live SQL:

この例は、Oracle Live SQLの「要素名とDEPRECATEプラグマの引数の不一致」で表示および実行できます

PACKAGE pkg13
AS
  PRAGMA DEPRECATE ('pkg13', 'Package pkg13 is deprecated, use pkg03');
  Y NUMBER;
END pkg13;

識別子が一致しない名前で適用されると、コンパイラは、プラグマが置き間違えられていることに関する警告を発行します。プラグマによる影響はありません。

CREATE PACKAGE pkg17
IS
  PRAGMA DEPRECATE ("pkg17");
END pkg17;

関連トピック

このドキュメント:

その他のドキュメント: