例外エラーは宣言部、実行部、および例外処理部で発生する可能性があり、異なる部分で発生した例外エラーの処理プロセスはそれぞれ異なります。
適用対象
この内容はOceanBaseデータベースEnterprise Editionにのみ適用されます。OceanBaseデータベースCommunity EditionはMySQLモードのみを提供します。
実行部で発生した例外
実行部で例外エラーが発生した場合、以下の2つのケースに分けてエラー処理を行います:
ケース1:現在のPLブロックがその例外エラーに対して処理を設定している場合、その処理方法を実行し、ブロックの実行を正常に完了した後、制御を外部ブロックに渡します。
ケース2:現在のPLブロックが例外処理部でその例外をキャッチしていない場合、上層ブロックの実行中にその例外が発生したことを意味します。その後、ケース1の実行手順を繰り返します。
例:
obclient> BEGIN
DECLARE
v_sal employees.salary%TYPE;
BEGIN
SELECT salary INTO v_sal FROM employees
WHERE empno=100;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||'-INNER');
END;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||'-OUTER');
END;
/
Query OK, 0 rows affected
-4026-INNER
内部ブロックの例外処理を削除した後、例外が外部ブロックによってキャッチされます。例:
obclient> BEGIN
DECLARE
v_sal employees.salary%TYPE;
BEGIN
SELECT salary INTO v_sal FROM employees
WHERE empno=100;
END;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||'-OUTER');
END;
/
Query OK, 0 rows affected
-4026-OUTER
宣言部で発生した例外
宣言部で発生した例外は、外部ブロックによってのみキャッチ可能であり、現在のブロックの例外処理ではキャッチできません。
obclient> BEGIN
DECLARE
abc number(3):='a';
BEGIN
null;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||'-INNER');
END;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||'-OUTER');
END;
/
Query OK, 0 rows affected
-5114-OUTER
例外の処理
一般的なアプリケーション処理において、プログラマーは例外をキャッチして処理することを推奨します。例外が適切に処理されない場合、プログラムの実行時にエラーが発生し、終了してしまい、その後のエラー調査に十分な診断情報を提供できなくなります。