PL/SQLで意図的にエラーを出力
内容
テーブルEmployeeに入力された範囲内の給与をもらっている社員のNo,SAL,NAMEを テーブルSalaryのEMPNO列、SAL列、DESCRIPTION列にINSERT データが存在しない場合"データがありません"とOracleのエラーメッセージを出力 存在している場合"完了"というメッセージを出力する。
対象テーブル
・Employee
No | SAL | NAME |
---|---|---|
1 | 1000 | JON |
2 | 2000 | KEI |
3 | 6000 | Rocca |
4 | 2500 | TOKA |
5 | 8500 | KAIBA |
・Salary
EMPNO | SAL | DESCRIPTION |
---|---|---|
詰まった点
複数列とるのでカーソルで処理する。 カーソル処理をFor文で回すので、データが存在しない(0件)場合 For文内のINSERTが実行されない為エラーにならない。
なのでエラー出力を別途で出すことにした。
プログラム
DECLARE --変数定義 e1 NUMBER; e2 NUMBER; flag BOOLEAN := false; --今回対象のデータをカーソルに CURSOR cur(emp1 NUMBER,emp2 NUMBER) IS SELECT CE.No,CE.SAL,CD.NAME FROM Employee CE, CBT_DEPT CD WHERE SAL BETWEEN emp1 AND emp2 AND CE.DEPTNO = CD.DEPTNO; --ユーザー定義例外を設定(正常取得時) SUCSESS EXCEPTION; BEGIN e1 := &employee1; e2 := &employee2; FOR i IN cur(e1,e2) LOOP INSERT INTO Salary(No,SAL,DESCRIPTION) VALUES(i.No,i.SAL,i.NAME); flag := true; END LOOP; IF(flag = false) THEN --データが存在しない場合エラーを起こす RAISE NO_DATA_FOUND; ELSE --取得できた場合の処理 RAISE SUCSESS; END IF; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('INSERTデータがありませんでした。'); DBMS_OUTPUT.PUT_LINE(SQLERRM); WHEN SUCSESS THEN DBMS_OUTPUT.PUT_LINE('正常終了'); WHEN OTHERS THEN --別の例外が発生した場合の処理 DBMS_OUTPUT.PUT_LINE(SQLERRM); END; /
出力結果
~~~~~~ employee1に値を入力してください: 1 旧 10: e1 := &employee1; 新 10: e1 := 1; employee2に値を入力してください: 2 旧 11: e2 := &employee2; 新 11: e2 := 2; INSERTデータがありませんでした。 ORA-01403: データが見つかりません。 PL/SQLプロシージャが正常に完了しました。 ~~~~~~ ~~~~~~ employee1に値を入力してください: 1 旧 10: e1 := &employee1; 新 10: e1 := 1; employee2に値を入力してください: 2000 旧 11: e2 := &employee2; 新 11: e2 := 2000; 正常終了 PL/SQLプロシージャが正常に完了しました。 ~~~~~~
とりあえず目的のデータはINSERTされたし、エラーの出力もできた。 もっと楽な方法ないかな・・・。