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