我创建了以下包,然后在运行提供的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:
答案 0 :(得分:0)
您需要选择单个对象类型,而不是两个单独的varchar2
值。像
EXECUTE IMMEDIATE
'SELECT ItemRec( ''ABCD'', ''CUSTID:'' ) FROM dual'
BULK COLLECT INTO v_items;
在你的代码示例中,没有理由在这里使用动态SQL,它只会使代码复杂化。希望有一个实际的理由在您正在构建的实际代码中使用动态SQL。