返回自定义表类型会引发错误

时间:2014-05-01 18:03:35

标签: oracle return-type

我创建了以下包,然后在运行提供的sql后出错。 我创建了对象类型,表类型,包。

请帮帮我。

CREATE TYPE ItemRec
 AS OBJECT
 (TABLE_NAME VARCHAR2(50),
    ISSUE      VARCHAR2(4000));
    /

CREATE TYPE ItemSet
IS
  TABLE OF ItemRec;
  /

CREATE OR REPLACE
PACKAGE PKG_REPL_DATA
AS
  FUNCTION FN_REPL_DELTA
    RETURN ItemSet;
END;
/
CREATE OR REPLACE
PACKAGE BODY PKG_REPL_DATA
AS
FUNCTION FN_REPL_DELTA
  RETURN ItemSet
AS
  v_items ItemSet;
  v_item_out ItemRec;
  v_list_out ItemSet;
BEGIN
  EXECUTE IMMEDIATE ' SELECT ''ABCD'', ''CUSTID: '' || 1 FROM DUAL' BULK COLLECT INTO v_items;
  RETURN v_items;
END;
END;
/

以下sql出错。

SELECT * FROM TABLE(cast(pkg_repl_data.fn_repl_delta() AS ItemSet));

错误:

Error starting at line 43 in command:
SELECT * FROM TABLE(cast(pkg_repl_data.fn_repl_delta() AS ItemSet))
Error report:
SQL Error: ORA-00932: inconsistent datatypes: expected UDT got CHAR
ORA-06512: at "DSTBREPR3.PKG_REPL_DATA", line 10
00932. 00000 -  "inconsistent datatypes: expected %s got %s"
*Cause:    
*Action:

1 个答案:

答案 0 :(得分:0)

您需要选择单个对象类型,而不是两个单独的varchar2值。像

这样的东西
EXECUTE IMMEDIATE
  'SELECT ItemRec( ''ABCD'', ''CUSTID:'' ) FROM dual'
  BULK COLLECT INTO v_items;

在你的代码示例中,没有理由在这里使用动态SQL,它只会使代码复杂化。希望有一个实际的理由在您正在构建的实际代码中使用动态SQL。