寝て起きて寝て

プログラミングが出来ない情報系のブログ

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されたし、エラーの出力もできた。 もっと楽な方法ないかな・・・。