2011-05-02 4 views
2

Oracle Objects를 처음 사용하는데 문제가 있습니다. VARRAY of REFs에서 항목을 참조 해제하는 방법을 모르겠습니다. 다음은 내가 가지고있는 문제를 재현하는 일부 소스 코드입니다. 오류는 다음과 같습니다 PLS-00306 : 'DEREF'에 대한 호출에 잘못된 번호 또는 인수의 유형Oracle PL/SQL : VARRAY의 REF를 어떻게 처리합니까?


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

나는 LOCS VARRAY에서 위치 IDX에서 REF를 얻으려고 할 때 오류가 DISPLAY_LOCS 절차에 나타납니다, 그 이름을 얻기 위해 그것을 명심해야합니다.

답변

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

대단히 감사합니다. –

관련 문제