14.67 SUPPRESSES_WARNING_6009プラグマ

SUPPRESSES_WARNING_6009プラグマは、サブルーチンにマークを付けることで、PLW-06009の警告がOTHERS例外ハンドラ内の呼び出し位置で抑制されていることを示します。マークが付いたサブルーチンには、RAISE文と同じ効果があり、コンパイラの警告PLW-06009が抑制されます。

OTHERS例外ハンドラは、RAISE文を使用するか最後の文としてRAISE_APPLICATION_ERRORプロシージャを使用することで明示的に例外が発生されている場合、コンパイラ警告PLW-06009を発行しません。同様に、SUPPRESSES_WARNING_6009プラグマのマークが付いたサブルーチンのOTHERS例外ハンドラからの呼び出しも、警告PLW-06009を発行しません。

SUPPRESSES_WARNING_6009プラグマは、次のSQL文で使用できます。

構文

suppresses_warning_6009_pragma ::=

セマンティクス

suppresses_warning_6009_pragma

SUPPRESSES_WARNING_6009プラグマは、スタンドアロン・サブプログラム、パッケージ・サブプログラムまたは抽象データ型定義のメソッドに適用されます。

スタンドアロン・サブプログラムの場合、SUPPRESSES_WARNING_6009プラグマは、サブプログラム定義の宣言ブロックの最初の項目として、キーワードISまたはASの直後に配置できます。

パッケージ仕様部、パッケージ本体および型仕様部では、サブプログラム宣言の直後にSUPPRESSES_WARNING_6009プラグマを配置する必要があります。

サブプログラムに個別の宣言と定義がある場合、SUPPRESSES_WARNING_6009プラグマは、サブプログラム宣言またはサブプログラム定義のどちらか(あるいは両方)に適用される可能性があります。

オーバーロードされたサブプログラムの場合、SUPPRESSES_WARNING_6009プラグマはマークが付いたオーバーロードにのみ適用されます。

パッケージ仕様部でSUPPRESSES_WARNING_6009プラグマがサブプログラムに適用されると、そのサブプログラムはパッケージ本体およびパッケージの呼び出しで使用する際にマークが付けられます。

パッケージ本体の定義でSUPPRESSES_WARNING_6009プラグマがサブプログラムに適用されると、そのサブプログラムがパッケージ仕様部で宣言されていたとしても、パッケージ本体で使用する際にのみマークが付けられます。

基本タイプ・オブジェクトでサブプログラムに適用されたSUPPRESSES_WARNING_6009プラグマは、派生タイプ・オブジェクトにプラグマがないオーラーライドが存在しないかぎり、派生タイプ・オブジェクトに継承されます。

SUPPRESSES_WARNING_6009プラグマは、型仕様部でサブプログラムに適用するときには","で終了できます。その他すべてのコンテキストで、プラグマは";"で終了します。

サブプログラムのSUPPRESSES_WARNING_6009プラグマは、そのサブプログラムの呼び出し位置で警告PLW-06009を抑制するように、コンパイラにヒントを提供します。

pls_identifier

プラグマが適用されているPL/SQL要素の識別子です。

この識別子は、SUPPRESSES_WARNING_6009プラグマのパラメータであり、適用先のサブプログラムの名前になります。

SUPPRESSES_WARNING_6009の識別子で宣言セクションのサブルーチンを識別できない場合、このプラグマは反映されません。

例14-41 警告PLW-6009の有効化

この例は、PLSQL_WARNINGSパラメータを設定して、デモ目的のセッションで警告PLW-6009を有効にする方法を示しています。
ALTER SESSION SET PLSQL_WARNINGS='ENABLE:(6009)';

例14-42 プロシージャでのSUPPRESSES_WARNING_6009プラグマ

この例は、SUPPRESSES_WARNING_6009プラグマのマークが付けられたスタンドアロン・プロシージャp1を示しています。p1プロシージャは、明示的に例外を生成しないプロシージャp2のOTHERS例外ハンドラから起動されます。
CREATE PROCEDURE p1
AUTHID DEFINER
IS
    PRAGMA SUPPRESSES_WARNING_6009(p1);
BEGIN
    RAISE_APPLICATION_ERROR(-20000, 'Unexpected error raised');
END;
/
プロシージャp2のコンパイル時に、警告PLW-06009は発行されません。
CREATE PROCEDURE p2
AUTHID DEFINER
IS
BEGIN
  DBMS_OUTPUT.PUT_LINE('In procedure p2');
EXCEPTION
  WHEN OTHERS THEN
    p1;                
END p2;
/

例14-43 ファンクションでのSUPPRESSES_WARNING_6009プラグマ

この例は、SUPPRESSES_WARNING_6009プラグマのマークが付けられたスタンドアロン・ファンクションf1を示しています。このファンクションは、明示的なRAISE文のないファンクションf2のOTHERS例外ハンドラから起動されます。
CREATE FUNCTION f1(id NUMBER) RETURN NUMBER
AUTHID DEFINER
IS
  PRAGMA SUPPRESSES_WARNING_6009(f1);
  x NUMBER;
BEGIN
  x := id + 1;
RETURN x;
END;
/
ファンクションf2のコンパイル時に、警告PLW-06009は発行されません。
CREATE FUNCTION f2(numval NUMBER) RETURN NUMBER
AUTHID DEFINER
IS
  i NUMBER;
BEGIN
  i := numval + 1;
  RETURN i;
EXCEPTION
  WHEN OTHERS THEN
    RETURN f1(i);
END;
/

例14-44 オーバーロードされるサブプログラムのパッケージ仕様部でのSUPPRESSES_WARNING_6009プラグマ

この例は、オーバーロードされるプロシージャp1を示しています。このプロシージャはパッケージ仕様部で宣言されています。p1の2番目のオーバーロードにのみSUPPRESSES_WARNING_6009プラグマのマークが付けられています。このマークが付けられたオーバーロードは、明示的なRAISE文がないプロシージャp6のOTHERS例外ハンドラから起動されます。

CREATE PACKAGE pk1 IS
   PROCEDURE p1(x NUMBER);
   PROCEDURE p1;
   PRAGMA SUPPRESSES_WARNING_6009(p1);
END;
/

CREATE OR REPLACE PACKAGE BODY pk1 IS
   PROCEDURE p1(x NUMBER) IS
   BEGIN
      DBMS_OUTPUT.PUT_LINE('In the first overload');
   END;

   PROCEDURE p1 IS
   BEGIN
      DBMS_OUTPUT.PUT_LINE('In the second overload');
      RAISE_APPLICATION_ERROR(-20000, 'Unexpected error');
   END;
END;
/
プロシージャp6は2番目にオーバーロードされるプロシージャp1を起動します。プロシージャp6のコンパイル時に、コンパイラは警告PLW-06009を発行しません。

CREATE OR REPLACE PROCEDURE p6 AUTHID DEFINER IS
j NUMBER := 5;
BEGIN
   j := j + 2;
EXCEPTION
   WHEN OTHERS THEN
       pk1.p1;
END;
/

例14-45 パッケージ本体の前方宣言でのSUPPRESSES_WARNING_6009プラグマ

この例は、SUPPRESSES_WARNING_6009プラグマのマークが付けられた前方宣言サブプログラムを示しています。このマークが付けられたプロシージャpnは、明示的なRAISE文がないプロシージャp5のOTHERS例外ハンドラから起動されます。

CREATE OR REPLACE PACKAGE pk2 IS
   PROCEDURE p5;
END;
/
パッケージ本体の作成時に、コンパイラは警告PLW-06009を発行しません。

CREATE OR REPLACE PACKAGE BODY pk2 IS
   PROCEDURE pn; /* Forward declaration */
   PRAGMA SUPPRESSES_WARNING_6009(pn);

   PROCEDURE p5 IS
   BEGIN
      DBMS_OUTPUT.PUT_LINE('Computing');
   EXCEPTION 
      WHEN OTHERS THEN
         pn;
   END;

   PROCEDURE pn IS
   BEGIN
      RAISE_APPLICATION_ERROR(-20000, 'Unexpected error');
   END;
END;
/

例14-46 オブジェクト型メソッドのSUPPRESSES_WARNING_6009プラグマ

この例は、抽象データ型定義(ADT) newidで宣言されたメンバー・メソッドに適用されるSUPPRESSES_WARNING_6009プラグマを示しています。マークが付けられたプロシージャlog_errorは、RAISE文のない型本体のOTHERS例外ハンドラから起動されます。
CREATE OR REPLACE TYPE newid AUTHID DEFINER
AS OBJECT(
  ID1 NUMBER,
  MEMBER PROCEDURE incr,
  MEMBER PROCEDURE log_error,
  PRAGMA SUPPRESSES_WARNING_6009(log_error)
);
/
型本体のコンパイル時に、コンパイラは警告PLW-06009を発行しません。
CREATE OR REPLACE TYPE BODY newid
AS
  MEMBER PROCEDURE incr
  IS
  BEGIN
     DBMS_OUTPUT.PUT_LINE('Computing value');
  EXCEPTION
     WHEN OTHERS THEN
        log_error;
  END;

  MEMBER PROCEDURE log_error
  IS
  BEGIN
    RAISE_APPLICATION_ERROR(-20000, 'Unexpected error');
  END;
END;
/