【问题标题】:Oracle PL/SQL: How to DEREF from a VARRAY of REFs?Oracle PL/SQL:如何从 VARRAY 的 REF 中进行 DEREF?
【发布时间】:2011-05-02 18:37:25
【问题描述】:

我是 Oracle 对象的新手,但遇到了问题。我不知道如何从 REF 的 VARRAY 中取消引用项目。下面是一些重现我遇到的问题的源代码。 错误是: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 过程中,当我尝试从 LOCS varray 中获取 IDX 位置的 REF 并通过 DEREF 获取名称时。

【问题讨论】:

    标签: sql oracle plsql dereference varray


    【解决方案1】:

    DEREF 必须在 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;
    /
    

    重现的好测试用例!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      • 2018-06-14
      • 2020-10-20
      • 2016-02-10
      • 2012-01-18
      • 2015-12-03
      • 1970-01-01
      相关资源
      最近更新 更多