Нужно ли открывать курсор, чтобы можно было использовать атрибуты курсора% FOUND или% NOTFOUND для неявного курсора? - PullRequest
1 голос
/ 08 ноября 2011

Можно ли выполнить c_emp%notfound после следующего цикла FOR или мне нужно сначала открыть курсор?

declare
 cursor c_emp is select * from employee;
 begin
    for c_rec in c_emp
    loop
        dbms_output.put_line(r_emp.first_Name);
    end loop;
 end;
 /

Я хочу выполнить оператор с одним оператором UPDATE после цикла FOR, нотолько если цикл FOR обработал любую из строк в курсоре.Я знаю, что могу установить флаг, но есть ли более чистый способ?

Ответы [ 2 ]

4 голосов
/ 08 ноября 2011

"Возможно ли выполнить c_emp% notfound после следующего цикла FOR"

Нет, это будет бросить ORA-01001: invalid cursor.Атрибуты курсора имеют область видимости только при открытом курсоре, который в этом синтаксисе находится между FOR и END LOOP.

Это ужасный аспект PL / SQL, но я боюсь, что вы 'Застрял со счетом.

2 голосов
/ 08 ноября 2011

Почему бы просто:

declare
 cursor c_emp is select * from employee;

 begin

    for c_rec in c_emp
    loop
       dbms_output.put_line(r_emp.first_Name);
    end loop;

    UPDATE some_table
       SET some_values
     WHERE some_conditions
       AND EXISTS (SELECT * FROM employee WHERE r.id IS NOT NULL)
 end;
 /

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

...