PL / SQl вложенный цикл If, если цикл внутренний - PullRequest
0 голосов
/ 21 декабря 2011

Привет всем. Я немного новичок в PL / SQL, поэтому немного запутался.У меня есть Курсор с именем rec, и во время его цикла у меня есть два вложенных оператора 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;

Теперь, когда у курсора есть одна запись, которая удовлетворяет второй IF (т.е. Zip имеет длину 5и код начинается с 303 или 304) он больше не выполняет оператор update для этих записей и всех записей после этого.Я даже пытался использовать оператор EXIT после логики в цикле IF, но безрезультатно.Что я делаю не так?

Ответы [ 3 ]

3 голосов
/ 22 декабря 2011

ЕСЛИ не петли.На самом деле это может быть важным моментом, так как вы говорите, что пытались использовать EXIT, и цель этого оператора - выйти из непосредственно включающего цикла.В этом случае это означает цикл над курсором (если, возможно, ваш «код для выполнения чего-либо» включает другие циклы).Таким образом, любой EXIT, который вы вставили туда, привел бы к завершению всего цикла.

Если он не выполнит обновление, то «код для выполнения чего-либо» либо (а) использует явную командукоторый влияет на управление потоком, например, EXIT, CONTINUE или GOTO, или (b) обнаружение ошибки, в результате которой элемент управления переключается на какой-либо обработчик исключений где-либо.

Если выполняетсяОбновление, но сбой, вы должны увидеть ошибку - если, опять же, где-то не существует обработчик исключений, который скрывает его от вас.

1 голос
/ 22 декабря 2011
  1. возможно, что строки status_log для обновления заблокированы другим сеансом.Вы можете запросить столбец blocking_session представления v $ session.

  2. «код что-то делает» что-то делает.

  3. Вы обновляете столбец file_processed но заблокировать строку для столбца status.Я не проверял, но это может быть проблемой.
0 голосов
/ 22 декабря 2011

Проверьте, не содержит ли ваше определение CURSOR таблицу status_log ... или это может быть проблемой.

...