QA@IT

Oracle(PL/SQL)での配列の配列の初期化

34273 PV

ORACLE 11gで、SQLから取得した値を配列に格納し、引数として返そうとしていますが、
配列の初期化がうまくいかず実行エラーになっています。

 [ORA-06531: 参照しているコレクションは初期化されていません。]

初期化エラーとなる配列は、レコード型に別のレコード型とコレクション型の項目が
混在する配列となっており、初期化エラーとなっているのは配列の中にある
レコード型とコレクション型の項目になります。

初期化しようと試行錯誤してみたのですが、エラーを解消する事ができませんでした。
どうかお力をお貸しください。

よろしくお願いいたします。

【配列の定義例】
    TYPE tA IS RECORD
    (
        A1  CHAR(8)
       ,A2  NUMBER
    );
    TYPE vA       IS VARRAY(3) OF tA;
    TYPE tC       IS VARRAY(3) OF NUMBER;
    TYPE tB  IS RECORD
    (
       ,B1        CHAR(6)
       ,B2        NUMBER
       ,B3        tC
       ,B4        vA
    );
    TYPE varB     IS TABLE OF tB;
    work          wB  := wB();

【配列格納処理例】
    work.EXTEND(1);
    work(1).B1        := '123456';
    work(1).B2        :=  123456;

    work(1).B3(1)     :=  1;       ←エラー発生箇所
    work(1).B3(2)     :=  2;
    work(1).B3(3)     :=  3;

    work(1).B4(1).A1  := '12345678';
    work(1).B4(1).A2  :=  1;
    work(1).B4(2).A1  := '12345678';
    work(1).B4(2).A2  :=  2;
    work(1).B4(3).A1  := '12345678';
    work(1).B4(3).A2  :=  3;

回答

初期化されていませんので、たとえば以下の様に初期化してあげる必要があります。

declare
    TYPE tA IS RECORD
    (
        A1  CHAR(8)
       ,A2  NUMBER
    );
    TYPE vA       IS VARRAY(3) OF tA;
    TYPE tC       IS VARRAY(3) OF NUMBER;
    TYPE tB  IS RECORD
    (
       B1        CHAR(6)
       ,B2        NUMBER
       ,B3        tC
       ,B4        vA
    );
    TYPE varB     IS TABLE OF tB;
    work          varB  := varB();

begin
    work.EXTEND(1);
    work(1).B1        := '123456';
    work(1).B2        :=  123456;

    work(1).B3 := tC();
    work(1).B3.EXTEND(3);
    work(1).B3(1)     :=  1;
    work(1).B3(2)     :=  2;
    work(1).B3(3)     :=  3;

    work(1).B4 := vA();
    work(1).B4.EXTEND(3);
    work(1).B4(1).A1  := '12345678';
    work(1).B4(1).A2  :=  1;
    work(1).B4(2).A1  := '12345678';
    work(1).B4(2).A2  :=  2;
    work(1).B4(3).A1  := '12345678';
    work(1).B4(3).A2  :=  3;
end;
編集 履歴 (0)

回答ありがとうございます。
ご回答の内容で実施したところ、正しく動作することを確認できました。

編集 履歴 (0)
  • 謝礼、返答などはコメントで -
ウォッチ

この質問への回答やコメントをメールでお知らせします。