Извлечение множества полей в пользовательский объект, определенный в пакете - PullRequest
2 голосов
/ 10 марта 2011

Предположим, у меня есть пакет A, который имеет

type type_bla is record (id number, ...);

Также в том же теле пакета у меня есть запрос, который выбирает все поля, необходимые для создания объекта.Если бы у меня был сохраненный объект, я мог бы сделать:

select type_bla(t1.id, t2.foo, t1.bar ...)
into instance_of_type_bla
from table t
inner join table2 t2 ON ...

Но так как у меня есть определенный тип, определенный в пакете - у него нет конструктора, поэтому я обязан изменить его на:

select t1.id, t2.foo, t1.bar ...
into instance_of_type_bla.id, instance_of_type_bla.foo ...
from table t
inner join table2 t2 ON ...

Это более элегантный способ заполнения таких объектов?

1 Ответ

3 голосов
/ 10 марта 2011

Вы должны иметь возможность просто выбирать данные непосредственно в записи, как если бы вы объявили запись% ROWTYPE.

Я объявлю пакет PKG_FOO, где функция GET_REC заполняет пользовательскую запись

SQL> create or replace package pkg_foo
  2  as
  3    type my_rec is record( col1 number, col2 number, col3 varchar2(10) );
  4    function get_rec
  5      return my_rec;
  6  end;
  7  /

Package created.

SQL> create or replace package body pkg_foo
  2  as
  3    function get_rec
  4      return my_rec
  5    is
  6      l_rec my_rec;
  7    begin
  8      select 1, 2, 'Justin'
  9        into l_rec
 10        from dual;
 11      return l_rec;
 12    end;
 13  end;
 14  /

Package body created.

И просто чтобы показать, что это работает

SQL> declare
  2    l_rec pkg_foo.my_rec;
  3  begin
  4    l_rec := pkg_foo.get_rec;
  5    p.l( 'Col1 = ' || l_rec.col1 );
  6    p.l( 'Col2 = ' || l_rec.col2 );
  7    p.l( 'Col3 = ' || l_rec.col3 );
  8  end;
  9  /
Col1 = 1
Col2 = 2
Col3 = Justin
...