2011-03-10 75 views
2

讓我們假設我有一個包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 ... 

它是更優雅的方式來填補這樣的對象?

回答

3

您應該能夠直接將數據直接選擇到記錄中,就像您聲明%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 
+0

哦:-S我不得不檢查之前,我問。謝謝 ;-) – zerkms 2011-03-10 01:20:08