2011-05-02 59 views
2

我是Oracle Objects的新手,遇到問題。我不知道如何從REF的VARRAY中取消引用項目。以下是一些源代碼,可以再現我擁有的問題。 錯誤是:PLS-00306:在調用「DEREF」錯誤數量或類型的參數Oracle PL/SQL:如何從REF的VARRAY中DEREF?


DROP TYPE LOC FORCE 
/
DROP TYPE LIST_LOC FORCE 
/
DROP TYPE PIZ FORCE 
/

CREATE OR REPLACE TYPE LOC AS OBJECT(
    NAME  VARCHAR2(30), 
    MEMBER FUNCTION GET_NAME RETURN VARCHAR2 
) 
/

CREATE OR REPLACE TYPE BODY LOC AS 
    MEMBER FUNCTION GET_NAME RETURN VARCHAR2 IS 
    BEGIN 
    RETURN SELF.NAME; 
    END; 
END; 
/

CREATE OR REPLACE TYPE LIST_LOC AS VARRAY(10) OF REF LOC 
/

CREATE OR REPLACE TYPE PIZ AS OBJECT(
    LOCS  LIST_LOC, 
    MEMBER PROCEDURE DISPLAY_LOCS 
) 
/

CREATE OR REPLACE TYPE BODY PIZ AS 
    MEMBER PROCEDURE DISPLAY_LOCS IS 
    BEGIN 
    FOR IDX IN SELF.LOCS.FIRST..SELF.LOCS.LAST LOOP 
     DBMS_OUTPUT.PUT_LINE(DEREF(SELF.LOCS(IDX)).GET_NAME()); --this is the line that generates the error 
    END LOOP; 
    END; 
END; 
/

出現在DISPLAY_LOCS過程中的錯誤,當我嘗試從LOCS VARRAY獲得在位置IDX的REF,並DEREF它得到的名稱。

回答

3

的DEREF必須在一個SQL語句: http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28371/adobjbas.htm#i463707

在PL/SQL價值,REF和DEREF 功能只能在SQL 聲明

這個工程

出現
CREATE OR REPLACE TYPE BODY PIZ AS 
    MEMBER PROCEDURE DISPLAY_LOCS IS 
    x varchar2(30) ; 
    BEGIN 
    FOR IDX IN SELF.LOCS.FIRST..SELF.LOCS.LAST LOOP 
     select DEREF(SELF.LOCS(IDX)).GET_NAME() into x from dual ; 
     DBMS_OUTPUT.PUT_LINE(x); --this is the line that generates the error 
    END LOOP; 
    END; 
END; 
/

好的測試用例重現!

+0

非常感謝。 – 2011-05-02 19:37:37