2016-11-28 1 views
0

Oracle 11g。これはばかばかしいはずですが、私は例を見ていないようです。私は、わずかに異なるログメッセージを書く必要がある2つの例外を持っています。そして、それらは同じUPDATEとCONTINUEを実行する必要があります。Oracle PL/SQL - すべての例外に対して同じコードブロックを実行するにはどうすればよいですか?

例外を構造化する方法はありますか?異なるロギングを維持しながら、UPDATEステートメントとCONTINUEステートメントを一度入力するだけです。

FOR my_rec IN my_cursor 
LOOP 

BEGIN 
...do some stuff 

EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
    log_detail.new('Skipping record - ID not found'); 

    UPDATE my_table 
    SET operation_result = 'Failed' 
    WHERE my_id = my_rec.some_id; 

    CONTINUE; 

WHEN OTHERS THEN 
    log_detail.new('Skipping record - unknown error'); 

    UPDATE my_table 
    SET operation_result = 'Failed' 
    WHERE my_id = my_rec.some_id; 

    CONTINUE; 
END; 
END LOOP; 
+0

あなたは 'update'(および任意の他のない別の手順(潜在的にローカル・プロシージャ)を定義することができます両方の例外ハンドラからそのプロシージャを呼び出しますか? –

+0

@JustinCave私はそれを考えましたが、私はまだCONTINUEをする必要があります。私はちょうど私が行方不明だったトリックがあると思ったが、それが唯一の方法なら... – TrojanName

+0

あなたがスキップしたいループ内に追加のロジックがない限り、ここで 'continue'が必要であるとは確信していません。私は 'log_detail.new'を呼び出し、ログメッセージと' my_rec.some_id'をパラメータとして受け取った 'update'を実行しました。 –

答えて

4

あなたがしようとしました:

FOR my_rec IN my_cursor 
LOOP 

    BEGIN 
    ...do some stuff 

    EXCEPTION 

     WHEN OTHERS THEN 
     if sqlcode=-1403 then 
      log_detail.new('Skipping record - ID not found'); 
     else 
      log_detail.new('Skipping record - unknown error'); 
     end if; 

     UPDATE my_table 
     SET operation_result = 'Failed' 
     WHERE my_id = my_rec.some_id; 

     CONTINUE; 
    END; 
END LOOP; 
+0

ありがとうございます。私はこの解決策を受け入れました。 SQLCODEを使うのがいいですね。 – TrojanName

1

あなたが試みることができる:

DECLARE 
    vError  VARCHAR2(1); 
    vMessage VARCHAR2(100); 
BEGIN 
    FOR my_rec IN my_cursor LOOP 
     vError := 'N'; 
     BEGIN 
      ...do some stuff 
     EXCEPTION 
      WHEN NO_DATA_FOUND THEN 
       vError := 'S'; 
       vMessage := 'Skipping record - ID not found'; 
      WHEN OTHERS THEN 
       vError := 'S'; 
       vMessage := 'Skipping record - unknown error'; 
     END; 

     IF vError = 'S' THEN 
      log_detail.new(vMessage); 

      UPDATE my_table 
      SET operation_result = 'Failed' 
      WHERE my_id = my_rec.some_id; 

      CONTINUE; 
     END IF; 
    END LOOP; 
END; 
+0

返事をありがとう。それはうまくいくが、それはちょっとしたファッジだ。良い創造的な解決策、しかし私はニコラを好む。 – TrojanName

関連する問題