3

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: 初期化されていないコレクションへの参照"

4

2 に答える 2

6

エラー メッセージにあるように、コレクション変数を初期化する必要があります。

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

ただし、ループのたびに単一の拡張機能を使用して、サイズを変更する必要もあります。

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

または、開始前の 1 回限りの延長:

...
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.

コレクションの詳細をお読みください

于 2016-09-22T12:07:14.740 に答える
2

コレクション変数の特定の要素に値を割り当てる前に、コンストラクターを使用して 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;
/
于 2016-09-25T10:09:19.293 に答える