#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, который вы можете настроить по мере необходимости.