В чем разница между явными и неявными курсорами в Oracle? - PullRequest
25 голосов
/ 16 сентября 2008

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

Ответы [ 16 ]

40 голосов
/ 16 сентября 2008

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

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

Пример

SELECT col INTO var FROM table WHERE something;

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

Пример

DECLARE   
  CURSOR cur IS SELECT col FROM table WHERE something; 
BEGIN
  OPEN cur;
  FETCH cur INTO var;
  CLOSE cur;
END;
17 голосов
/ 16 сентября 2008

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

DECLARE 
CURSOR cur IS 
  SELECT columns FROM table WHERE condition;
BEGIN
...

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

...
BEGIN
   SELECT columns INTO variables FROM table where condition;
END;
...
4 голосов
/ 13 февраля 2012

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

2. ПРЕДПОЛАГАЕТСЯ: когда любой исполняемый блок PL / SQL выдает инструкцию sql. PL / SQL создает неявный курсор и автоматически управляет средствами происходит открытие и закрытие. Используется при возврате оператора SQL только одна строка. Имеет 4 атрибута SQL% ROWCOUNT, SQL% FOUND, SQL% NOTFOUND, SQL% ISOPEN.

3.EXPLICIT: Он создается и управляется программистом. Это нужно каждому время явное открытие, выборка и закрытие. Используется, когда SQL-оператор возвращает более одной строки. Имеет также 4 атрибута CUR_NAME% ROWCOUNT, CUR_NAME% FOUND, CUR_NAME% NOTFOUND, CUR_NAME% ISOPEN. Он обрабатывает несколько строк с помощью цикла. Программист может также передать параметр явному курсору.

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

declare 
   cursor emp_cursor 
   is 
   select id,name,salary,dept_id 
   from employees; 
   v_id employees.id%type; 
   v_name employees.name%type; 
   v_salary employees.salary%type; 
   v_dept_id employees.dept_id%type; 
   begin 
   open emp_cursor; 
   loop 
   fetch emp_cursor into v_id,v_name,v_salary,v_dept_id; 
   exit when emp_cursor%notfound;
   dbms_output.put_line(v_id||', '||v_name||', '||v_salary||','||v_dept_id); 
   end loop;                    
   close emp_cursor; 
   end;
3 голосов
/ 04 июля 2012

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

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

3 голосов
/ 13 мая 2010

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

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

3 голосов
/ 17 сентября 2008

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

http://www.oracle.com/technology/oramag/oracle/04-sep/o54plsql.html

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1205168148688

3 голосов
/ 16 сентября 2008

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

CURSOR my_cursor IS
  SELECT table_name FROM USER_TABLES

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

2 голосов
/ 16 сентября 2008

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

Подробнее см. http://www.unix.com.ua/orelly/oracle/prog2/ch06_03.htm.

1 голос
/ 23 апреля 2019

В PL / SQL курсор является указателем на эту контекстную область. Он содержит всю информацию, необходимую для обработки выписки.

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

Явные курсоры: Явные курсоры являются программируемыми курсорами для получения большего контроля над областью контекста. Явный курсор должен быть определен в разделе объявлений блока PL / SQL. Он создается в операторе SELECT, который возвращает более одной строки.

Синтаксис для создания явного курсора:

CURSOR cursor_name IS select_statement; 
1 голос
/ 09 марта 2015

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

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

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

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  2    l_loops  NUMBER := 100000;
  3    l_dummy  dual.dummy%TYPE;
  4    l_start  NUMBER;
  5
  6    CURSOR c_dual IS
  7      SELECT dummy
  8      FROM   dual;
  9  BEGIN
 10    l_start := DBMS_UTILITY.get_time;
 11
 12    FOR i IN 1 .. l_loops LOOP
 13      OPEN  c_dual;
 14      FETCH c_dual
 15      INTO  l_dummy;
 16      CLOSE c_dual;
 17    END LOOP;
 18
 19    DBMS_OUTPUT.put_line('Explicit: ' ||
 20                         (DBMS_UTILITY.get_time - l_start) || ' hsecs');
 21
 22    l_start := DBMS_UTILITY.get_time;
 23
 24    FOR i IN 1 .. l_loops LOOP
 25      SELECT dummy
 26      INTO   l_dummy
 27      FROM   dual;
 28    END LOOP;
 29
 30    DBMS_OUTPUT.put_line('Implicit: ' ||
 31                         (DBMS_UTILITY.get_time - l_start) || ' hsecs');
 32  END;
 33  /
Explicit: 332 hsecs
Implicit: 176 hsecs

PL/SQL procedure successfully completed.

Итак, заметна значительная разница.

Больше примеров здесь .

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