В вашем коде есть две проблемы.
1) type ch_type is table of record
синтаксически неверно. Сначала необходимо объявить запись, а затем определить ее тип коллекции.
2) Использование неявного цикла курсора не является эффективным способом загрузки коллекции и, безусловно, не может быть выполнено так, как вы пытаетесь. Вместо этого используйте гораздо более простой метод BULK COLLECT
.
declare
type ch_type is record(id number, name varchar2(50));
type ch_type_tab is table of ch_type;
rec_typr ch_type_tab;
begin
select emp_id,first_name bulk collect into
rec_typr from emp;
for i in rec_typr.first..rec_typr.last
loop
dbms_output.put_line(rec_typr(i).id);
end loop;
end;
/
выход
1
2
3
4
5
6
7
8
9
10
11
12
13
14
PL/SQL procedure successfully completed.
EDIT
Мне нужно заполнить запись циклом, а не массовым сбором.
Так ли это?
Да, есть. Но он менее эффективен , чем метод, описанный выше.
declare
type ch_type is record(id number, name varchar2(50));
type ch_type_tab is table of ch_type;
rec_typr ch_type_tab := ch_type_tab();
i INTEGER := 1;
begin
rec_typr.extend;
for rec in
(
select emp_id,first_name bulk collect into
rec_typr from emp
)
loop
rec_typr(i).id := rec.emp_id;
rec_typr(i).name := rec.first_name;
rec_typr.extend;
i := i + 1;
end loop;
for i in rec_typr.first..rec_typr.last
loop
dbms_output.put_line(rec_typr(i).id);
end loop;
end;
/