2013-03-19 16 views
0

有這個包,我嘗試使用下面的代碼執行。但是我得到一個錯誤嘗試使用UDT在Oracle中執行存儲過程時引用「未初始化的組合體」

ORA-06530:參考未初始化的複合

代碼:

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

封裝創建如下面的用戶定義的數據類型作爲輸入&輸出PARAMS :

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; 
/

回答

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; 

或簡單:因爲你已經初始化的OutputTyp但不是objtyp部分

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

你的代碼,是失敗。

但正如我在prior question of yours中所說的,multiset可以避免所有這些。

+0

是的,multiset方法可以解決問題 - 謝謝!真的很感謝這些輸入@DazzaL – 2013-03-20 16:15:44

相關問題