Зачем использовать явные курсоры вместо обычных циклов?

Я писал основные веб-приложения в течение года (для Oracle db), и поскольку функции довольно просты, большинство из нас придерживаются регулярных циклов FOR для получения наших данных:

for i in (select * from STUDENTS) loop
      htp.prn(i.student_last_name || ', ' || i.student_first_name || ' ' || i.student_dob);
end loop;

Но курсоры, похоже, являются «правильными» способами. Я могу найти много информации о том, что такое курсоры, и о разных способах их прохождения, но я не могу найти твердую причину, по которой их можно использовать в обычных циклах FOR. Это зависит от потребностей процедуры? Есть ли неотъемлемые преимущества, о которых я должен знать?

10 голосов | спросил ini 16 +04002012-10-16T22:39:54+04:00312012bEurope/MoscowTue, 16 Oct 2012 22:39:54 +0400 2012, 22:39:54

3 ответа


14

Введенный вами код использует курсор. Он использует неявный цикл курсора.

Бывают случаи, когда использование явного цикла курсора (т. е. объявление переменной CURSOR в разделе декларации) дает либо более чистый код, либо лучшую производительность

  1. Если у вас есть более сложные запросы, которые вы не можете реорганизовать в представлениях, это может сделать код более удобным для чтения, если цикл повторяется через student_cursor вместо того, чтобы включать в себя 30-строчный оператор SQL, который встраивает кучу логики. Например, если вы печатали всех студентов, которые были очищены до выпускников, и это связано с присоединением к таблицам с их академическими записями, требованиям их программы обучения, таблицам с информацией об академических залах, таблицам с информацией о просроченных библиотечных книгах, таблицы с информацией о неоплаченных сборах, административных переопределениях и т. д., вероятно, было бы целесообразно реорганизовать код, чтобы этот запрос не застрял в середине кода, связанного с представлением списка пользователю. Это может быть связано с созданием представления, которое инкапсулирует всю эту логику. Или это может быть связано с созданием явного курсора, который был объявлен либо как часть текущего блока PL /SQL, либо в каком-либо блоке PL /SQL более высокого уровня (т. Е. Курсор, объявленный в пакете), чтобы он был повторно использован. Или может потребоваться сделать что-то еще для инкапсуляции и повторного использования (например, создавая вместо этого конвейерную функцию таблицы).
  2. Если вы хотите использовать массовые операции в PL /SQL, вы обычно хотите использовать явные курсоры. Вот поток StackOverflow, который обсуждает различия производительности между явными и неявными курсорами . Если все, что вы делаете, вызывает htp.prn, делая BULK COLLECT, вероятно, ничего не покупает. В других случаях это может привести к существенному повышению производительности.
ответил Justin Cave 16 +04002012-10-16T22:50:55+04:00312012bEurope/MoscowTue, 16 Oct 2012 22:50:55 +0400 2012, 22:50:55
2

Я вижу, что многие разработчики используют явные курсоры вместо неявных курсоров из старой привычки. Это потому, что в Oracle версии 7 это всегда было более эффективным способом. В настоящее время, как правило, наоборот. Специально с оптимизатором, который при необходимости может переписать неявный курсор для циклов для массового сбора.

ответил Peter Åkerlund 18 +04002012-10-18T08:10:22+04:00312012bEurope/MoscowThu, 18 Oct 2012 08:10:22 +0400 2012, 08:10:22
0

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

Нам было рекомендовано переписать все, используя явные курсоры, и ошибка исчезла.

Не основная причина, по которой вы, возможно, захотите использовать явные выражения по неявным, но стоит отметить.

EDIT: Oracle 12c.

ответил Robotron 24 Mayam16 2016, 11:02:01

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132