sql - Oracle PL/SQL : How to DEREF from a VARRAY of REFs?

标签 sql oracle plsql dereference varray

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

当我尝试从 LOCS 变量数组中获取位置 IDX 处的 REF 并对其进行 DEREF 以获得名称时,DISPLAY_LOCS 过程中出现错误。

最佳答案

DEREF 必须位于 SQL 语句中: http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28371/adobjbas.htm#i463707

In PL/SQL the VALUE, REF and DEREF functions can appear only in a SQL statement

这有效

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

很好的测试用例,可以重现!

关于sql - Oracle PL/SQL : How to DEREF from a VARRAY of REFs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5860984/

相关文章:

sql - 我想将 unix 和 sqlplus 的输出复制到一个文件中

java - 我如何调用 sqljdbc_auth.dll

mysql - 优化 MySQL 查询以查找重复项?

sql - PL/SQL 处理多个 notfound exptions +constraint violations

sql - 更新语句失败,因为我有一个名为 order 的列

SQLPlus 试图删除包两次

syntax - 如何在 PLSQL 中格式化日期变量

sql-server - 相当于SQL Server中的Oracle外部表

java - 将 Oracle 或 Sql Server DDL 转换为 Derby

mysql - 如何使用 SQL 有选择地从包含多个值(每个值均以逗号分隔)的列中删除特定值?