Размер шрифта:
Скачать - В чем разница между явными и неявными курсорами в Oracle?
Play

скачать - В чем разница между явными и неявными курсорами в Oracle?

Я немного ржавый на моем курсорном лингви в PL / SQL. Кто-нибудь знает это?

С помощью явных курсоров вы имеете полный контроль над доступом к информации в базе данных. Вы решаете, когда ОТКРЫТЬ курсор, когда FETCH записывает из курсора (и, следовательно, из таблицы или таблиц в инструкции SELECT курсора), сколько записей для извлечения и когда CLOSE курсор. Информация о текущем состоянии вашего курсора доступна путем изучения атрибутов курсора.

Явный курсор - это тот, который вы объявляете, например:

Неявный курсор - это один, созданный для поддержки любого встроенного SQL-кода, который вы пишете (либо статического, либо динамического).

Явный курсор определяется как таковой в блоке объявления:

неявный курсор вставляется непосредственно в кодовый блок:

В наши дни скрытые курсоры более эффективны, чем явные курсоры.

Каждый оператор SQL, выполняемый базой данных Oracle, имеет связанный с ним курсор, который является частной рабочей областью для хранения информации о обработке. Неявные курсоры неявно создаются сервером Oracle для всех операторов DML и SELECT.

Вы можете объявлять и использовать Явные курсоры для обозначения частной рабочей области и получать доступ к ее сохраненной информации в вашем программном блоке.

Неявный курсор - это тот, который создается автоматически для вас Oracle при выполнении запроса. Это проще кодировать, но страдает от

  • неэффективность (стандарт ANSI указывает, что он должен получить дважды, чтобы проверить, существует ли более одной записи)
  • уязвимость к ошибкам данных (если вы когда-либо получаете две строки, это вызывает исключение TOO_MANY_ROWS)

Явный курсор - это тот, который вы создаете сами. Это требует большего количества кода, но дает больше контроля - например, вы можете просто открывать-извлекать-закрывать, если вам нужна только первая запись, и все равно, есть ли другие.

курсор foo - выбор * из бла; начать открывать вывод извлечения при закрытии курсора yada yada yada

не используйте их, используйте неявные

курсор foo - выбор * из бла;

для n в цикле foo x = n.some_column end loop

Я думаю, вы можете это сделать

для n in (select * from blah) loop .

Придерживайтесь неявного, они закрываются, они более читабельны, они делают жизнь легкой.

PL / SQL выдает неявный курсор всякий раз, когда вы выполняете инструкцию SQL непосредственно в коде, если этот код не использует явный курсор. Он называется «неявным» курсором, потому что вы, разработчик, явно не объявляете курсор для инструкции SQL.

Явным курсором является оператор SELECT, который явно определен в разделе объявления вашего кода и в этом процессе назначено имя. Для операторов UPDATE, DELETE и INSERT нет явного указателя.

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

Курсор - это указатель на частную область SQL, в которой хранится информация о обработке определенного оператора SELECT или DML.

Курсор - это окно SELECTed в таблице Oracle, это означает, что группа записей присутствует в таблице Oracle и удовлетворяет определенным условиям. Курсор также может выбрать все содержимое таблицы. С помощью курсора вы можете манипулировать столбцами Oracle, накладывая их на результат. Примером неявного курсора является следующее:

С FOR . LOOP . END LOOP вы автоматически открываете и закрываете курсор, когда все записи курсора анализируются.

Пример явного курсора следующий:

В явном курсоре вы открываете и закрываете курсор явным образом, проверяя наличие записей и указывая условие выхода.

1.CURSOR: Когда PLSQL выдает sql-команды, он создает частную рабочую область для синтаксического анализа и выполнения инструкции sql, которая называется курсором.

2.IMPLICIT: когда любой PL / SQL-исполняемый блок выдает команду sql. PL / SQL создает неявный курсор и автоматически управляет имплицитом open & close. Он используется, когда оператор sql возвращает только одну строку. Он имеет 4 атрибута SQL% ROWCOUNT, SQL% FOUND, SQL% NOTFOUND, SQL% ISOPEN.

3.EXPLICIT: он создан и управляется программистом. Он нужен каждый раз, когда явное открытие, выборка и закрытие. Он используется, когда оператор sql возвращает более одной строки. Он также имеет 4 атрибута CUR_NAME% ROWCOUNT, CUR_NAME% НАЙДЕНО, CUR_NAME% NOTFOUND, CUR_NAME% ISOPEN. Он обрабатывает несколько строк, используя цикл. Программист может передать параметр слишком явным курсором.

  • Пример: Явный курсор

Неявные курсоры требуют анонимной буферной памяти.

Явные курсоры могут выполняться снова и снова, используя их имя. Они хранятся в пользовательском пространстве памяти, а не хранятся в анонимной буферной памяти и, следовательно, могут быть легко доступны после этого.

Неявный курсор возвращает только одну запись и вызывается автоматически. Однако явные курсоры вызываются вручную и могут возвращать более одной записи.

Я знаю, что это старый вопрос, однако, я думаю, было бы полезно добавить практический пример, чтобы показать разницу между ними с точки зрения производительности.

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

Давайте посмотрим разницу в производительности между двумя:

Таким образом, заметная разница очевидна.

Как указано в других ответах, неявные курсоры проще в использовании и менее подвержены ошибкам.

И неявные или явные курсоры в Oracle PL / SQL показывают, что неявные курсоры в два раза быстрее, чем явные.

Странно, что никто еще не упомянул Implicit FOR LOOP Cursor :

Это намного короче, чем явный вид.

Это также обеспечивает хорошее обходное решение для обновления нескольких таблиц от CTE .

📎📎📎📎📎📎📎📎📎📎