Вложенный неявный курсор не очищает данные - PullRequest
0 голосов
/ 18 мая 2018

У меня есть анонимный блок oracle pl / sql с неявным курсором в цикле for, который вложен в цикл for следующим образом:

FOR secuence IN 1..3 LOOP
  FOR registro_notificacion IN (
             SELECT 'data' FROM my_table WHERE my_table.column1=secuence)
      LOOP
         --work with data
  END LOOP; END LOOP;

Проблемы возникают, когда у меня возвращаются значения secuence=1 и пустой на остальных, потому что по какой-то причине неявный курсор не clean сам по себе.Итак, на secuence=2 я ничего не делаю, потому что нет данных, но по какой-то причине у него все еще есть данные, возвращенные в первом цикле (secuence=1).

Должен ли я объявить и явный курсор закрывать в конце каждой итерации?Хотя я думаю использовать 3 для циклов, по одному на каждое значение secuence, но это не та идея, которую я предполагаю.

1 Ответ

0 голосов
/ 18 мая 2018

Я все время использую курсорные циклы for и никогда не видел описанную вами ситуацию.Единственное, что я могу подумать, это то, что у вас есть переменная с именем secuence, объявленная в другом месте вашей программы, которая, как оказалось, установлена ​​на 1. В этом случае компилятор PL / SQL может предпочесть использовать глобальную переменную secuence, а нечем переменная контроля цикла secuence при создании оператора SQL.Хорошее практическое правило - использовать уникальное имя для каждой переменной управления циклом.

Однако вы можете полностью избавиться от цикла FOR secuence..., используя:

FOR registro_notificacion IN (SELECT 'data'
                                FROM my_table
                                WHERE my_table.column1 BETWEEN 1 AND 3
                                ORDER BY my_table.column1)
LOOP
     --work with data
END LOOP;

ОткрытиеОдин курсор, как правило, дешевле, чем открытие трех курсоров.

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...