Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在oracle存储过程中填充数组?_Oracle_Plsql - Fatal编程技术网

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

如何在oracle存储过程中填充数组?,oracle,plsql,Oracle,Plsql,如何在存储过程中使用数组(Varray)。实际上,我已经创建了一个存储过程,从中检索元素列表 例如: create or replace procedure GetTargetFields ( fileformat in varchar2, filefields out Varray(4) ) IS BEGIN SELECT id INTO filefields FROM tab

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

例如:

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

BEGIN

 SELECT id 
   INTO filefields  
   FROM tablename;

END;
两件事:

您需要声明一个命名类型——不能在参数声明中直接使用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;
两件事:

您需要声明一个命名类型——不能在参数声明中直接使用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;

使用
批量收集到

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

使用
批量收集到

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

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

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

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

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

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

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

+1:合理的建议。根据我的经验,嵌套表的应用范围比varray更广(因为您不必知道最大大小)。+1:合理的建议。根据我的经验,嵌套表的应用范围比varray更广(因为您不必知道最大大小)。