Как вручную инициализировать коллекцию записей в PL / SQL? - PullRequest
15 голосов
/ 14 сентября 2010

ребята. Вот простой пример двумерного массива в PL / SQL, который отлично работает.

declare
  type a is table of number;
  type b is table of a;

  arr b := b(a(1, 2), a(3, 4));
begin
  for i in arr.first .. arr.last loop
    for j in arr(i).first .. arr(i).last loop
      dbms_output.put_line(arr(i) (j));
    end loop;
  end loop;
end;

Что мне нужно сделать, так это создать нечто подобное для таблицы RECORDS. Как это:

 type a is record(a1 number, a2 number);
 type b is table of a;

Вопрос в том, могу ли я вручную инициализировать этот вид массива, или он должен быть заполнен bulk collects или подобным? Тот же синтаксис, что и выше, кажется, не работает, и я не смог найти образец инициализации в руководствах.

Ответы [ 2 ]

17 голосов
/ 14 сентября 2010

Синтаксиса "конструктора" для ЗАПИСЕЙ не существует, поэтому вы должны заполнить их следующим образом:

declare
 type a is record(a1 number, a2 number);
 type b is table of a;
 arr b := b();
begin
 arr.extend(2);
 arr(1).a1 := 1;
 arr(1).a2 := 2;
 arr(2).a1 := 3;
 arr(2).a2 := 4;
end;
13 голосов
/ 23 марта 2015

Это работает без объектов, но вы должны объявить функцию конструктора для значений типа 'a'.

declare  
  type a is record(a1 number, a2 number);
  type b is table of a;

  arr b;

  --Constructor for type a
  function a_(a1 number, a2 number) return a is
    r_a a;
  begin
    r_a.a1 := a1;
    r_a.a2 := a2;

    return(r_a);
  end;

begin
  arr := b(a_(1, 2), a_(3, 4), a_(5, 6), a_(7, 8));

  for i in arr.first .. arr.last loop
    dbms_output.put_line(arr(i).a1||', '||arr(i).a2);
  end loop;
end;
...