Oracle PL/SQL:如何从 VARRAY 的 REF 中进行 DEREF?

Posted

技术标签:

【中文标题】Oracle PL/SQL:如何从 VARRAY 的 REF 中进行 DEREF?【英文标题】:Oracle PL/SQL: How to DEREF from a VARRAY of REFs? 【发布时间】: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 获取名称时。

【问题讨论】:

【参考方案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;
/

重现的好测试用例!

【讨论】:

以上是关于Oracle PL/SQL:如何从 VARRAY 的 REF 中进行 DEREF?的主要内容,如果未能解决你的问题,请参考以下文章

我可以直接从用户接受 PL/SQL 中 VARRAY 中的值吗?

如何通过 PL/SQL 中的 VARRAY 函数中的变量传递字符串值

Oracle_PL/SQL 集合

在 PL SQL 中使用 varray 作为常量

PL/SQL数组

在 PL/SQL VARRAY 中使用 ROWTYPE 会产生编译错误