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プラグマ
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;
/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プラグマ
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;
/関連トピック
