инициализация типа объекта схемы против типа пакета - PullRequest
1 голос
/ 28 октября 2019

У меня есть следующий код:

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;

, который работает как положено.

Вместо типа PLSQL я хочу использовать тип объекта схемы, и код становится:

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).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;
/

Но на этот раз возникает следующая ошибка:

ORA-06533: нижний индекс за счетчиком ORA-06512: в строке 7 ORA-06512: в «SYS.DBMS_SQL», строка 1721

Может кто-нибудь заметит, что я делаю не так, пожалуйста?

1 Ответ

3 голосов
/ 28 октября 2019

Ваш первый пример кода завершается ошибкой с 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;
/

дБ <> скрипка

...