在存储过程中使用自定义类型

时间:2014-11-06 02:17:57

标签: oracle types

我有自定义类型:

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,查询另一个表以查找该父项的所有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

我的问题是: 我的做法错了吗?我应该加入这两张桌子吗? 2.无论如何,我将不得不填充父类型(这个存储的proc提要到另一个存储过程,其中父类型作为输入。什么是选择父类型数据的有效方法?

1 个答案:

答案 0 :(得分: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;
/

然后您可以使用BULK 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;