2016-09-22 126 views
2

我有一個VARRAY,我想通過循環向VARRAY添加元素。這是我到目前爲止所嘗試的。如何使用循環將值添加到VARRAY

DECLARE 
TYPE code_array_ IS VARRAY(26) OF VARCHAR2(6); 
codes_ code_array_; 

BEGIN 
FOR i IN 1..26 LOOP  
    codes_(i) := dbms_random.string('U',6); 
    END LOOP; 
END; 

上面的代碼給我一個錯誤

「ORA-06531:引用未初始化的收集」

+0

你確定你需要一個varray,而不是一個嵌套的表嗎?那麼這26個限制是非常有用的,它彌補了嵌套表所帶來的功能損失? –

+0

@William_Robertson VArray維護元素順序,而嵌套表和關聯數組不會。在需要元素順序的應用程序中,varray是您唯一的選擇。 – JeramieH

回答

3

由於錯誤消息說,你需要initialise the collection variable

... 
BEGIN 
    codes_ := code_array_(); 
    ... 

但您還需要調整它的大小,每次只需一個擴展名圍繞循環:

FOR i IN 1..26 LOOP  
    codes_.extend; 
    ... 

或者你之前一次性擴大開始:

... 
BEGIN 
    codes_ := code_array_(); 
    ... 
    codes_.extend(26); 
    FOR i IN 1..26 LOOP  
    ... 

你也可以使用post-擴大規模來控制循環,節省再硬編碼26:

DECLARE 
    TYPE code_array_ IS VARRAY(26) OF VARCHAR2(6); 
    codes_ code_array_; 
BEGIN 
    codes_ := code_array_(); 
    codes_.extend(26); 
    FOR i IN 1..codes_.count LOOP  
    codes_(i) := dbms_random.string('U',6); 
    END LOOP; 
END; 
/

PL/SQL procedure successfully completed. 

Read more about collections

0

您必須使用構造函數初始化varray,並在將值分配給集合變量的特定元素之前對其進行擴展。 在PLSQL上下文中,最好使用關聯集合。

declare 
    type code_array_ is varray(26) of varchar2(6); 
    codes_ code_array_ := code_array_(); 
begin 
    <<init_codes>> begin codes_.extend(26); 
     for i in codes_.first..codes_.last loop codes_(i) := dbms_random.string('U',6); 
    end loop; end init_codes; 
end; 
/

或者您可以使用sql來初始化整個集合,例如,這樣的事情:

declare 
    type code_array_ is varray(26) of varchar2(6); 
    codes_ code_array_; 
begin 
    select dbms_random.string('U',6) bulk collect into codes_ from dual connect by level<=26; 
end; 
/