Ваш первый пример кода завершается ошибкой с ORA-06533: Subscript beyond count
db <> fiddle .
Чтобы исправить это, вам нужно EXTEND
коллекция:
declare
type r_rec is record (col1 number, col2 varchar2(10));
type t_rec is table of r_rec;
v_rec t_rec := t_rec();
begin
v_rec.EXTEND(2);
v_rec(1).col1 := 1;
v_rec(1).col2 := 'one';
v_rec(2).col1 := 2;
v_rec(2).col2 := 'two';
for i in v_rec.first .. v_rec.last
loop
dbms_output.put_line('col1 = ' || v_rec(i).col1 || ', col2 = ' || v_rec(i).col2);
end loop;
end;
/
Ваш второй пример кода имеет ту же проблему;вам нужно EXTEND
коллекции, но вам также нужно инициализировать объекты:
create or replace type r_rec as object (col1 number, col2 varchar2(10));
create or replace type t_rec as table of r_rec;
declare
v_rec t_rec := t_rec();
begin
v_rec.EXTEND(2);
v_rec(1) := r_rec( 1, 'one' );
v_rec(2) := r_rec( 2, 'two' );
for i in v_rec.first .. v_rec.last
loop
dbms_output.put_line('col1 = ' || v_rec(i).col1 || ', col2 = ' || v_rec(i).col2);
end loop;
end;
/
, которые выдают:
col1 = 1, col2 = one
col1 = 2, col2 = two
или вы можете инициализировать значения, встроенные в объявление:
declare
v_rec t_rec := t_rec( r_rec( 1, 'one' ), r_rec( 2, 'two' ));
begin
for i in v_rec.first .. v_rec.last
loop
dbms_output.put_line('col1 = ' || v_rec(i).col1 || ', col2 = ' || v_rec(i).col2);
end loop;
end;
/
дБ <> скрипка