скачать - В чем разница между явными и неявными курсорами в 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 .