0

みなさん、こんにちは。私はPL / SQLに少し慣れていないので、少し混乱しています。カーソルが呼び出されrec、ループ中に2つのネストされた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;

これで、カーソルに2番目を満たすレコードが1つある場合IF(つまり、Zipの長さが5で、コードが303または304で始まる場合)update、そのレコードとそれ以降のすべてのレコードのステートメントはヒットしなくなります。ループ内EXITのロジックの後にステートメントを使用しようとしましたが、役に立ちませんでした。IF私は何が間違っているのですか?

4

3 に答える 3

3

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

更新が実行されない場合、「何かを実行するコード」は、(a)、、、、などのフロー制御に影響を与える明示的なコマンドを使用するEXITCONTINUEGOTO(b)制御を引き起こしているエラーに遭遇するかのいずれかです。どこかで例外ハンドラに切り替えます。

実行が更新されているが失敗している場合は、エラーが表示されているはずです。ただし、例外ハンドラーがどこかに隠れている場合を除きます。

于 2011-12-21T21:44:43.197 に答える
1
  1. 更新するstatus_log行が別のセッションによってロックされている可能性があります。v$sessionビューのblocking_session列を照会できます。

  2. 「何かをするためのコード」は何かをしている。

  3. 列を更新しますfile_processedが、列の行をロックしますstatus。私はテストしていませんが、それが問題になる可能性があります。
于 2011-12-21T20:25:29.030 に答える
0

CURSOR定義にテーブルが含まれているか除外されているかを確認してくださいstatus_log...それが問題である可能性があります。

于 2011-12-21T20:01:20.767 に答える