再宣言された事前定義の例外
事前定義の例外の再宣言、つまり、事前定義の例外の名前と同じ名前でユーザー定義の例外を宣言することはお薦めしません。(事前定義の例外の名前のリストは、表12-3を参照してください。)
事前定義の例外を再宣言すると、ローカルな宣言がパッケージSTANDARD
のグローバルな宣言をオーバーライドします。パッケージ名STANDARD
で例外名を修飾しないかぎり、グローバルに宣言された例外のために記述された例外ハンドラでは例外を処理できなくなります。
例12-9に、これを示します。
例12-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: unable to convert string value containing '1' to a 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.