2010-10-21 102 views
0

如何在存储过程中使用数组(Varray)。实际上,我制作了一个存储过程,从中检索元素列表。如何在Oracle存储过程中填充数组?

例如:

create or replace procedure GetTargetFields (fileformat in varchar2, 
               filefields out Varray(4)) 
IS 

BEGIN 

SELECT id 
    INTO filefields 
    FROM tablename; 

END; 

回答

3

使用BULK COLLECT INTO

SQL> CREATE OR REPLACE TYPE vrray_4 AS VARRAY(4) OF VARCHAR2(10); 
    2/

Type created 
SQL> CREATE OR REPLACE PROCEDURE GetTargetFields(fileformat IN VARCHAR2, 
    2            filefields OUT vrray_4) IS 
    3 BEGIN 
    4  SELECT dummy BULK COLLECT INTO filefields FROM dual; 
    5 END; 
    6/

Procedure created 
SQL> DECLARE 
    2  x vrray_4; 
    3 BEGIN 
    4  GetTargetFields(NULL, x); 
    5 END; 
    6/

PL/SQL procedure successfully completed 

另外,还要确保您的查询不返回超过4行(对于VARRAY(4)),或者你会遇到ORA-22165

1

两件事情:

您需要声明命名类型 - 你不能在参数声明直接使用VARRAY。 (除非在11g中已更改)

您需要使用BULK COLLECT才能使用单个查询来填充集合。

例子:

CREATE TYPE fieldlist AS VARRAY(4) OF NUMBER; 
CREATE PROCEDURE GetTargetFields(filefields OUT fieldlist) 
    AS 
    BEGIN 
    SELECT id BULK COLLECT INTO filefields FROM tablename; 
    END; 
2

Niraj。你应该使用Vincent提供的原则,但是我建议你在你的逻辑中不需要确切的 varray类型,而使用嵌套表类型而不是varray。如果查询返回多于4行,这将为您节省ORA-22165错误 - 嵌套表将自动扩展到所需的大小。关于PL/SQL集合类型

declare 
    type TStrTab is table of varchar2(10); 
    fStrTab TStrTab := TStrTab(); 
begin 
    select ... bulk collect into fStrTab from... 
end; 

更多信息,Oracle官方PL-SQL用户指南和参考Chapter 5中找到:你如下定义嵌套表类型。

+1

+1:健全的建议。根据我的经验,嵌套表比varrays的应用范围更广(因为您不必知道最大尺寸)。 – 2010-10-22 12:10:43