Не работает SELECT из переменной объявленной в FOR-LOOP
declare
i number;
begin
for jj in (select * from BpmsHistoricProcessInstanceEntityImpl HPI
where HPI.endTime is not null and HPI.endTime <= sysdate -1)
loop
select count(*) into i from jj;
end loop;
end;
Выдаёт ошибку, что не существует таблица jj, как можно сделать запрос к jj?, Мне просто jj надо использовать несколько раз, для нескольких запросов.
Ответы (2 шт):
jj это не таблица, а одна запись из вашего подзапроса к таблице BpmsHistoricProcessInstanceEntityImpl. Запись jj содержит все поля запроса.
Циклы представленного вида позволяют итерироваться по записям из подзапроса.
begin
for jj in (select 1 value from dual union select 2 from dual)
loop
dbms_output.put_line(jj.value);
end loop;
end;
результат
1
2
По видимому, речь идёт о вложенных таблицах. Если они объявленны в анонимном блоке, то их нельзя использовать в SQL запросах, они не видны SQL движку. Они должны быть объявлены как минимум в пакете. Подробнее в этой теме.
Попробуйте следующий воспроизводимый пример:
create or replace package emppack as
type empRows is table of hr.employees%rowtype;
type empInfo is record (employee_id number, memo varchar2 (256));
type empInfs is table of empInfo;
procedure proc (rc out sys_refcursor);
end;
/
create or replace package body emppack as
procedure proc (rc out sys_refcursor) is
emps empRows;
delemps empInfs;
begin
select * bulk collect into emps
from hr.employees
where employee_id between 110 and 112;
dbms_output.put_line (emps.count||' employee rows found');
forall idx in indices of emps
delete from hr.employees e
where e.employee_id = emps(idx).employee_id
returning employee_id, first_name||' '||last_name bulk collect into delemps;
dbms_output.put_line (delemps.count||' following employees were deleted');
open rc for select * from table (delemps);
end;
end;
/
Так запустить и посмотреть результат:
set autoprint on serverout on
var rc refcursor
exec emppack.proc (:rc)
rollback
3 employee rows found
3 following employees were deleted
EMPLOYEE_ID MEMO
----------- --------------------------------
110 John Chen
111 Ismael Sciarra
112 Jose Manuel Urman