Должен ли я открывать курсор, чтобы иметь возможность использовать атрибуты курсора %FOUND или%NOTFOUND для неявного курсора?

#sql #oracle #plsql #oracle10g #database-cursor

#sql #Oracle #plsql #oracle10g #база данных-курсор

Вопрос:

Возможно ли выполнить 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 обработал какую-либо из строк в курсоре. Я знаю, что могу установить флаг, но есть ли более чистый способ?

Ответ №1:

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

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

Это неприятный аспект PL / SQL, но, боюсь, вы застряли с подсчетом.

Ответ №2:

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

 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;
 /
  

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