如何在存储过程中使用数组(Varray)。实际上,我已经制作了一个存储过程,我可以从中检索元素列表。
例如:
create or replace procedure GetTargetFields ( fileformat in varchar2,
filefields out Varray(4) )
IS
BEGIN
SELECT id
INTO filefields
FROM tablename;
END;
答案 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;