如何在oracle存储过程中填充数组?

时间:2010-10-21 14:38:52

标签: oracle plsql

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

例如:

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

BEGIN

 SELECT id 
   INTO filefields  
   FROM tablename;

END;

3 个答案:

答案 0 :(得分: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 :(得分:2)

尼拉吉。您应该使用Vincent提供的原则,但我建议您使用嵌套表类型而不是varray,以防您在逻辑中不需要完全 varray类型。如果查询返回超过4行,这将使您免于ORA-22165错误 - 嵌套tabled将自动扩展到所需的大小。您可以按如下方式定义嵌套表类型:

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

有关PL / SQL集合类型的更多信息,请参阅官方Oracle PL-SQL用户指南和参考Chapter 5

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