2016-07-21 2 views
0

Я не мог придумать практическую ситуацию для использования явных курсоров в коде PL/SQL. Кто-нибудь может поделиться некоторыми сценариями? Благодаря!Практические примеры использования явного курсора оракула

+0

['where current of'] (http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/static.htm#CIHHIIID) -clause требует явного указателя. – user272735

ответ

2

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

+2

Если наш код использует один и тот же SQL более одного раза, мы можем пересмотреть наш дизайн. – APC

+0

Но использование одного и того же SQL более одного раза не обязательно плохой дизайн. – user272735

2

Существует два ясных варианта использования для явных курсоров.

Первый, когда мы хотим, чтобы исследовать на наличие записи и обработки результатов в основном потоке нашего кода:

open emp_cur (p_empno); 
fetch emp_cur into l_emp_rec; 
if emp_cur%notfound then 
    ... 

Это может быть аккуратнее тогда

begin 
    select e.* into l_emp_rec 
    from emp e 
    where e.empno = p_empno; 
    .... 
exception 
    when no_data_found then 
     ... 

Кроме от чего бы то ни было, какие другие части нашей программы могли бы бросить no_data_found?

Другое дело, когда мы хотим использовать массовый сбор с предложением LIMIT (и почти наверняка мы хотим использовать предложение LIMIT, когда мы делаем массовую сборку). Так

open big_cursor; 
loop 
    fetch big_cursor bulk collect into l_array limit 1000; 
    exit when l_array.count() = 0; 
    for idx in 1..l_array.count() loop 
     ... 

Явные курсоры ввести накладные расходы в наш код, поэтому они воспринимаются как неуклюжий и неэффективный. Но это не всегда так. Фактически, если мы закодируем инструкцию массового сбора с неявным курсором, Oracle будет оптимизировать это, чтобы использовать предложение LIMIT со значением 100. Это не плохой дефолт, но, вероятно, мы сможем получить лучшую производительность с более высоким значением 1000, 5000 , даже 10000. Таким образом, контроль над значением LIMIT позволяет использовать явный курсор.

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

+0

Я с тобой здесь - я почти всегда использую явные курсоры (единственный раз, когда я этого не делаю, когда я обновляю чужой код, и я хочу сохранить согласованный стиль). Но я не знал, что вы можете использовать только предложение LIMIT для явного курсора. Я видел много примеров, которые * используют * LIMIT - вы говорите, что лимит игнорируется в пользу значения по умолчанию? –

+0

Вы явно не указали очень удобный [rowtype] (http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/composites.htm#CIHHHGAE) -трибут, который может использоваться только с явными курсорами , То есть 'l_emp_rec emp_cur% rowtype;'. – user272735

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