11.6 再宣言された事前定義の例外
事前定義の例外の再宣言、つまり、事前定義の例外の名前と同じ名前でユーザー定義の例外を宣言することはお薦めしません。(事前定義の例外の名前のリストは、表11-3を参照してください。)
事前定義の例外を再宣言すると、ローカルな宣言がパッケージSTANDARDのグローバルな宣言をオーバーライドします。パッケージ名STANDARDで例外名を修飾しないかぎり、グローバルに宣言された例外のために記述された例外ハンドラでは例外を処理できなくなります。
例11-9に、これを示します。
例11-9 再宣言された事前定義の識別子
DROP TABLE t; CREATE TABLE t (c NUMBER);
次のブロックでは、INSERT文から事前定義の例外INVALID_NUMBERが暗黙的に呼び出され、例外ハンドラにより処理されています。
DECLARE default_number NUMBER := 0; BEGIN INSERT INTO t VALUES(TO_NUMBER('100.00', '9G999')); EXCEPTION WHEN INVALID_NUMBER THEN DBMS_OUTPUT.PUT_LINE('Substituting default value for invalid number.'); INSERT INTO t VALUES(default_number); END; /
結果:
Substituting default value for invalid number.
次のブロックでは、事前定義の例外INVALID_NUMBERを再宣言しています。INSERT文から事前定義の例外INVALID_NUMBERが暗黙的に呼び出されても、例外ハンドラでは処理されません。
DECLARE default_number NUMBER := 0; i NUMBER := 5; invalid_number EXCEPTION; -- redeclare predefined exception BEGIN INSERT INTO t VALUES(TO_NUMBER('100.00', '9G999')); EXCEPTION WHEN INVALID_NUMBER THEN DBMS_OUTPUT.PUT_LINE('Substituting default value for invalid number.'); INSERT INTO t VALUES(default_number); END; /
結果:
DECLARE
*
ERROR at line 1:
ORA-01722: invalid number
ORA-06512: at line 6
例外ハンドラの例外名を修飾すると、前述のブロックの例外ハンドラにより事前定義の例外INVALID_NUMBERが処理されます。
DECLARE default_number NUMBER := 0; i NUMBER := 5; invalid_number EXCEPTION; -- redeclare predefined exception BEGIN INSERT INTO t VALUES(TO_NUMBER('100.00', '9G999')); EXCEPTION WHEN STANDARD.INVALID_NUMBER THEN DBMS_OUTPUT.PUT_LINE('Substituting default value for invalid number.'); INSERT INTO t VALUES(default_number); END; /
結果:
Substituting default value for invalid number.