2011-12-21 9 views
0

皆さん、こんにちは皆私は少しPL/SQLに慣れていますので少し混乱します。私はrecと呼ばれるカーソルを持っていると私は2つの入れ子になっているIFステートメントをそれを通してループしている。PL/SQlネストされたループif内部ループが終了しない

今カーソルが二 IFを満たす一つのレコードを持っている時はいつでも
CURSOR Cur IS 
    SELECT Mil.Id, 
      Mil.Record_Num, 
      Mil.Status, 
      Mil.file_processed, 
      Mil.Updated_By 
     FROM status_log mil 
    WHERE Mil.file_processed != 'Processed' 
    For Update of Mil.file_processed; 

FOR Rec IN Cur LOOP 

       IF (Rec.status = 'Ready' OR Rec.status = 'Go') THEN 
        IF Length(Rec.Zip) = 5 AND 
       (Substr(Rec.Zip, 1, 3) = '303' OR 
       Substr(Rec.Zip, 1, 3) = '304') THEN 

         l_state:= 'ATL';        
        END IF; 

      UPDATE status_log mil 
      SET file_processed = 'Processed' 
      WHERE current of cur   

     END IF; 

COMMIT; 
      END LOOP; 

その後そのレコードとすべてのレコードに対してもうupdate文を打つdoesntの(すなわちZipは、長さが5で、コードが303または304で始まります) 。私はIFループのロジックの後にEXITステートメントを使ってみましたが役に立たなかった。私は間違って何をしていますか?あなたのCURSOR定義が問題になる可能性があるテーブルstatus_logを...含むか除外かどうかを確認するために

+0

は、カーソル、および「何かをするコード」を投稿してください:) –

+2

は、エラーをスローし、静かに出ているいずれかのチャンスはありますか? (つまり、あなたの手続きに '他の人がnullになったときに例外が発生します。 ') – Allan

+0

こんにちは、私はちょうど特定の値に変数を設定する何かをするコード。私はそれをコメントして、空のブロックで実行しようとしたが、同じ問題があったので、そのコードは責任を負いません。ビットチェックアップデートを編集しました。 – Eosphorus

答えて

2

IFSは、ループではありません。 EXITを使用しようとしたと言っているので、これは実際には重要なポイントです。そのステートメントの目的は、すぐに囲むループを終了することです。この場合、これはカーソル上のループを意味します(「何かを行うコード」に他のループが含まれる場合を除きます)。したがって、あなたが入れたEXITは、ループ全体を終了させるでしょう。

それが更新を実行しない場合は、「何かをするコードは、」(A)は、EXITCONTINUE、又はGOTOとして、フロー制御に影響を与える明示的なコマンドを使用して、または(b)に遭遇のいずれかであります制御が何らかの例外ハンドラにどこかで切り替わる原因となるエラーです。

あれば更新するが、その後、あなたがエラーが表示されなければならない、失敗して実行 - 、再び、あなたからそれを隠してどこかに例外ハンドラがない限り。

+0

何かが変数に値を設定していただけです。私は空のループを使用してその部分をコメントしてみましたが、運はありません:( – Eosphorus

0

チェック。

+0

原因ではありません - オラクル社は、一度オープンすると一貫性のあるデータセットをカーソルが "認識"することを保証します。 –

1
  1. 更新するstatus_log行が別のセッションによってロックされる可能性があります。 v $ session viewのblocking_session列を照会できます。

  2. 「何かをするコードは、」何かをやっています。

  3. あなたは、列file_processedを更新したが、列statusの行をロックします。私はテストしていませんが、それは問題になる可能性があります。
+0

実際には申し訳ありませんでしたが、私はfile_processedをステータスではなくロックしていました。投稿を編集しました。私はどこかで例外を叩いていると思うし、エラーを記録するために使用するパッケージは動作していないと思う。何が起こっているのかを見るためにdbmsの出力行を書いています – Eosphorus

関連する問題