2014-11-06 40 views
0

我有一个自定义类型中:与自定义类型工作的存储过程

CREATE OR REPLACE TYPE my_type IS OBJECT 
(
    field_one number, 
    field_two varchar2(10), 
); 

和这种类型的嵌套表:

CREATE TYPE my_type_nt AS TABLE OF my_type; 

,并包含此嵌套表另一个自定义类型:

CREATE OR REPLACE TYPE parent IS OBJECT 
(
    field_one number, 
    field_two my_type_nt, 
); 

我必须查询父对象的表,然后根据该记录的PK,查询anot她的表为该父级的所有my_type对象。

所以像:

-- i know following code is wrong 
select * into parent1 
from table1 
where table1.column1 = something; 

然后:

for every record in parent1 
    populate it's my_type_nt 
    for every record in my_type_nt 
     do something 
    end loop 
end loop 

我的问题是:1。 是我的方法不对?我应该加入两张桌子吗? 2.我将不得不填充父类型(这存储proc饲料到另一个父类型作为输入的存储过程。什么是有效的方式来选择数据到父类型?

回答

1

我们可以填充嵌套表与子查询中使用CAST()和MULTISET()

select parent(p.id, 
    cast(multiset(select c.c_id 
         , c.c_name 
       from c 
       where c.p_id = p.id) 
    as my_type_nt) 
    ) 
into local_par 
from p 
where p.id = param_id; 

这是否是最适合你的方法取决于你在你的伪代码混淆什么实际的处理:populate it's my_type_nt ... do something

“什么是有效的方法选择数据到母型“

如果要处理多个家长,你应该为它创建一个嵌套表类型太:

CREATE TYPE parent_nt AS TABLE OF parent_t; 
/

然后你可以用批量填充它COLLECT语法:

select parent(p.id, 
    cast(multiset(select c.c_id 
         , c.c_name 
       from c 
       where c.p_id = p.id) 
    as my_type_nt) 
    ) 
bulk collect into local_par_nt 
from p 
where p.id <= param_id; 

然后循环通过收集处理每个父

for idx in 1 .. local_par_nt.count() 
loop 
    do_something; 
相关问题