Oracle PL / SQL: как отменить ссылку из набора ссылок?

#sql #oracle #plsql #dereference #varray

#sql #Oracle #plsql #Разыменование #varray

Вопрос:

Я новичок в Oracle Objects, и у меня проблема. Я не знаю, как разыменовать элемент из набора ссылок. Ниже приведен некоторый исходный код, который воспроизводит проблему, с которой я столкнулся. Ошибка: PLS-00306: неправильное количество или типы аргументов при вызове ‘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, когда я пытаюсь получить ссылку в позиции IDX из LOCS varray и отменить ее, чтобы получить имя.

Ответ №1:

удаление ссылки должно быть в инструкции SQL: http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28371/adobjbas.htm#i463707

В PL / SQL функции VALUE, 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;
/
  

хороший тестовый пример для воспроизведения!