0

このパッケージがあり、以下のコードを使用して実行しようとしています。ただし、エラーが発生します

ORA-06530: 初期化されていないコンポジットへの参照

コード:

DECLARE
   StudyNum    InputTyp := InputTyp ();
   StudyDetails   OutputTyp := OutputTyp ();
BEGIN
   StudyNum.EXTEND;
   StudyNum (1) := '9071';
   my_package.my_procedure(StudyNum, StudyDetails);
END;
/

パッケージは、入力および出力パラメーターとしてユーザー定義のデータ型を使用して、次のように作成されます。

Create OR REPLACE Type InputTyp  AS VARRAY(200) OF VARCHAR2 (1000);
CREATE  TYPE OBJTYP AS OBJECT
(
    A            NUMBER,
    B             VARCHAR2 (1000),       
    C        VARCHAR2 (100)       
);
CREATE TYPE OutputTyp IS VARRAY (2000) OF   OBJTYP;
/

CREATE OR REPLACE PACKAGE my_package
AS
    PROCEDURE my_procedure(p_StudyNum IN InputTyp,p_StdyDtl OUT OutputTyp);
END my_package;
/
CREATE OR REPLACE PACKAGE BODY my_package
AS
   PROCEDURE my_procedure(p_StudyNum IN InputTyp,p_StdyDtl OUT OutputTyp)
IS
    i            BINARY_INTEGER := 1;
    j            BINARY_INTEGER := 1;
   CURSOR c_StudyTbl
   IS
     SELECT A,  B, C
     FROM my_table
     WHERE Study_Number = p_StudyNum(i);

  v_StudyTbl   OBJTYP;
BEGIN
    p_StdyDtl := OutputTyp ();
    LOOP
 --  This is the first cursor opened for each of the items in the list.
  EXIT WHEN i > p_StudyNum.count;

 OPEN c_StudyTbl;
 LOOP

    FETCH c_StudyTbl INTO v_StudyTbl;
    EXIT WHEN c_StudyTbl%NOTFOUND;

    p_StdyDtl.EXTEND ();
    p_StdyDtl (j).A := v_StudyTbl.A;
    p_StdyDtl (j).B := v_StudyTbl.B;
    p_StdyDtl (j).C := v_StudyTbl.C;
    j := j + 1;
 END LOOP;
 CLOSE c_StudyTbl;
i := i + 1;
END LOOP;

IF c_StudyTbl%ISOPEN
THEN
   CLOSE c_StudyTbl;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
   NULL;
END;
END my_package;
/
4

1 に答える 1

1

次のいずれかを行う必要があります。

p_StdyDtl(p_StdyDtl.last) := OBJTYP(null, null, null);
p_StdyDtl (j).A := v_StudyTbl.A;
p_StdyDtl (j).B := v_StudyTbl.B;
p_StdyDtl (j).C := v_StudyTbl.C;

またはより簡単:

p_StdyDtl(j) := OBJTYP(v_StudyTbl.A, v_StudyTbl.B, v_StudyTbl.C);

OutputTyp部分ではなく初期化したため、コードはそのまま失敗しますobjtyp

しかし、あなたの前の質問で言ったように、はmultisetそのすべてを回避します。

于 2013-03-19T22:12:36.243 に答える