如何在oracle存储过程中填充数组?
如何在存储过程中使用数组(Varray)。实际上,我已经创建了一个存储过程,从中检索元素列表 例如:如何在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
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-22165Niraj。您应该使用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更广(因为您不必知道最大大小)。