2015-08-28 3 views
0

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

мы можем реализовать курсор для примера

SET serveroutput ON; 
    DECLARE 
     CURSOR test_cursor 
     IS 
     SELECT * FROM employees; 
    BEGIN 
     FOR i IN test_cursor 
     LOOP 
     DBMS_OUTPUT.PUT_LINE(i.employee_id||' '||i.First_name); 
     END LOOP; 
    END; 

Также мы можем осуществить то же самое в ниже способом

SET serveroutput ON; 
    BEGIN 
     FOR rec IN 
     (SELECT * FROM employees 
    ) 
     LOOP 
     DBMS_OUTPUT.PUT_LINE(rec.employee_id ||' ' ||rec.First_name); 
     END LOOP; 
    END; 

Для чего нужен курсор? Пожалуйста, не могли бы вы сообщить мне о различиях и преимуществах/недостатках?

+3

Проверьте это: http://dba.stackexchange.com/questions/27045/why-use-explicit-cursors-instead-of-regular-loops –

ответ

0

В обоих случаях вы используете курсоры. Первый объявлен и назван (явно). Второй анонимный (неявный).

http://docs.oracle.com/cd/B10501_01/appdev.920/a96624/01_oview.htm#740.

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

Кроме того, насколько я знаю, план выполнения не генерируется так часто, как при использовании неявного курсора (БД выполняет поиск запроса в SGA по хешу запроса и может найти уже сохраненный план выполнения, тем самым пропускает план выполнения поколения).

https://docs.oracle.com/database/121/TGSQL/tgsql_sqlproc.htm#TGSQL175

0

Так, во-первых, они оба известны как курсора для циклов.

http://docs.oracle.com/database/121/LNPLS/cursor_for_loop_statement.htm#LNPLS1143

Одно из отличий удобства и простоты использования между двумя формами является то, что вторая форма помещает SQL, исполняемые непосредственно перед кодом, в котором используется набор результатов. Это может облегчить понимание кода.

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

Смежные вопросы