2010-10-21 99 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