Вложенные внутренние курсоры PL / SQL - PullRequest
0 голосов
/ 14 февраля 2012

Мне было просто интересно, когда практично использовать вложенный или внутренний явный курсор в PL / SQL.Можно ли всегда избежать ситуации с помощью JOINS?
Было бы здорово, если бы на практике использовались внутренние курсоры!Заранее спасибо.

1 Ответ

4 голосов
/ 14 февраля 2012

Если вы говорите о таких конструкциях, как

FOR outer IN (<<query A>>)
LOOP
  FOR inner IN (<<query B that depends on data from the outer query>>)
  LOOP
    <<do something>>
  END LOOP;
END LOOP;

По существу (то есть, за исключением некоторого углового случая, когда оптимизатор выбирает неверный план, а исправлять это любым другим способом непрактично) всегда будет более эффективно объединять два запроса и выполнять объединение. Движок SQL обладает гораздо большей гибкостью, чтобы выяснить, как объединить две таблицы (или два запроса), и намного лучше, чем код, который вы пишете в движке PL / SQL.

Тем не менее, если вы имеете дело с небольшими объемами данных и у вас (или других разработчиков, обслуживающих систему) возникнут проблемы с выполнением комбинированного запроса, могут быть веские причины с точки зрения удобства сопровождения для таких циклов кода, как этот. Скорее всего, это будет подход, когда разработчикам из других языков будет удобнее читать, например. Если объемы данных невелики, дополнительные затраты на ручное кодирование соединения с вложенным циклом обычно будут относительно небольшими и все же могут привести к коду, который выполняется приемлемо.

Лично я бы старался избегать такого рода конструкций, если это вообще возможно, но я склонен работать с системами, которые обрабатывают большие объемы данных, и с людьми, которым удобно писать правильный PL / SQL и надлежащий SQL, поэтому запросы с соединениями будет более читабельным. С другой стороны, если вы делаете одноразовое обновление небольшой таблицы, может быть быстрее и проще написать быстрый блок, который выполняет такой цикл, и передать его кому-то другому для проверки, а не для того, чтобы убедитесь, что объединение двух больших запросов не делает ничего неожиданного.

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