Не работает 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 шт):

Автор решения: Alex R.

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
→ Ссылка
Автор решения: 0xdb

По видимому, речь идёт о вложенных таблицах. Если они объявленны в анонимном блоке, то их нельзя использовать в 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               
→ Ссылка