2016-09-22 24 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  
    ... 

あなたはまた、再びハードコーディング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を初期化し、コレクション変数の特定の要素に値を割り当てる前に、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; 
/
関連する問題