2011-06-24 89 views
2

我想获得在一个过程(b)中分配的列表,并将其作为OUT参数返回给过程中的类型为'table of varchar2'的变量(一个)。我如何定义OUT参数类型?Oracle过程'out''varchar2'表类型参数

前。)

procedure_a() 
type t_list IS TABLE OF VARCHAR2(10) 

l_list t_list; 

procedure_b(l_list); 

end procedure_a; 

procedure_b(out_list OUT ????) 

会是什么类型OUT呢?

在此先感谢。

回答

5

该类型需要在A和B都可以引用的地方声明。一种选择是声明类型的包装,即

SQL> create package some_pkg 
    2 as 
    3 type t_list is table of varchar2(10); 
    4 
    5 procedure procedureA; 
    6 procedure procedureB(p_list OUT t_list); 
    7 end; 
    8 
    9/

Package created. 

SQL> create or replace package body some_pkg 
    2 as 
    3 procedure procedureA 
    4 as 
    5  l_list t_list; 
    6 begin 
    7  procedureB(l_list); 
    8  dbms_output.put_line(l_list.count); 
    9 end; 
10 
11 procedure procedureB 
12  (p_list OUT t_list) 
13 as 
14 begin 
15  select ename 
16  bulk collect into p_list 
17  from emp; 
18 end; 
19 end; 
20/

Package body created. 

SQL> exec some_pkg.procedureA; 
16 

PL/SQL procedure successfully completed. 

另一种选择是声明类型的SQL,即

SQL> create type t_list 
    2  as table of varchar2(10); 
    3/

Type created. 

SQL> ed 
Wrote file afiedt.buf 

    1 create or replace procedure procedureB(p_list OUT t_list) 
    2 as 
    3 begin 
    4 select ename 
    5  bulk collect into p_list 
    6  from emp; 
    7* end; 
SQL>/

Procedure created. 

SQL> create or replace procedure procedureA 
    2 as 
    3 l_list t_list; 
    4 begin 
    5 procedureB(l_list); 
    6 dbms_output.put_line(l_list.count); 
    7 end; 
    8/

Procedure created. 

SQL> exec procedureA; 
16 

PL/SQL procedure successfully completed. 
+0

谢谢你的建议。 只是最后一个问题,说我知道确切的列表(示例名称的静态列表),使用TABLE VARCHAR2类型与Vararray的优点是什么? – help

+0

@help - 如果您知道集合将包含的元素数量,并且该数字永远不会改变,那么使用嵌套表格而不是VARRAY没有任何优势。但是,由于嵌套表的大小并不固定,因此当将来静态列表不可避免地发生变化时,嵌套表会更加灵活。 –

+0

嘿,谢谢。 – help