ORA-00932: 数据类型不一致: 预期 - 得到 - 执行函数时
ORA-00932: inconsistent datatypes: expected - got - when executing a function
我已经创建了一个 UDT
CREATE or REPLACE TYPE user_tmp IS Object
(id VARCHAR2(50), name VARCHAR2(100),section VARCHAR2(100));
create or REPLACE type tmp_array is table of user_tmp;
在此之后,我创建了一个函数来显示 temp
table 数据
CREATE OR REPLACE FUNCTION EMP_BY_JOB
RETURN tmp_array pipelined
IS
v_query varchar2(4000);
v_cursor COMMON.rCursor;
stuDetailsTable tmp_array;
BEGIN
v_query := 'select * from temp';
DBMS_OUTPUT.PUT_LINE('QUERY: ' || v_query);
OPEN v_cursor FOR v_query;
LOOP
FETCH v_cursor BULK COLLECT INTO stuDetailsTable LIMIT 100;
DBMS_OUTPUT.PUT_LINE('Cursor fetch');
EXIT WHEN stuDetailsTable.COUNT = 0;
FOR i in stuDetailsTable.FIRST..stuDetailsTable.LAST LOOP
DBMS_OUTPUT.PUT_LINE('rows'|| i);
PIPE row(stuDetailsTable(i));
END LOOP;
END LOOP;
CLOSE v_cursor;
RETURN;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('QUERY: ' || v_query);
raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM||' -QUERY- '||v_query);
RETURN;
END EMP_BY_JOB;
现在我运行下面的命令只是为了测试我的功能EMP_BY_JOB
select * from table(EMP_BY_JOB) ;
但是,我遇到了数据类型不一致的错误。请帮忙
问题是您的查询选择了正常投影:
select * from temp_table;
这很好,除非您尝试填充一个对象 table。要完成这项工作,您需要 return 来自 temp_table
的数据转换为您的类型。
我不知道你的基础投影 table 所以我猜测列名与类型的属性相匹配。但无论如何,你需要这样的东西:
select user_tmp(tt.id, tt.name, tt.section) from temp_table tt;
顺便说一句,为什么那是一个字符串?您的程序不需要动态 SQL。这也可以。
OPEN v_cursor FOR select user_tmp(tt.id, tt.name, tt.section) from temp_table tt;
我已经创建了一个 UDT
CREATE or REPLACE TYPE user_tmp IS Object
(id VARCHAR2(50), name VARCHAR2(100),section VARCHAR2(100));
create or REPLACE type tmp_array is table of user_tmp;
在此之后,我创建了一个函数来显示 temp
table 数据
CREATE OR REPLACE FUNCTION EMP_BY_JOB
RETURN tmp_array pipelined
IS
v_query varchar2(4000);
v_cursor COMMON.rCursor;
stuDetailsTable tmp_array;
BEGIN
v_query := 'select * from temp';
DBMS_OUTPUT.PUT_LINE('QUERY: ' || v_query);
OPEN v_cursor FOR v_query;
LOOP
FETCH v_cursor BULK COLLECT INTO stuDetailsTable LIMIT 100;
DBMS_OUTPUT.PUT_LINE('Cursor fetch');
EXIT WHEN stuDetailsTable.COUNT = 0;
FOR i in stuDetailsTable.FIRST..stuDetailsTable.LAST LOOP
DBMS_OUTPUT.PUT_LINE('rows'|| i);
PIPE row(stuDetailsTable(i));
END LOOP;
END LOOP;
CLOSE v_cursor;
RETURN;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('QUERY: ' || v_query);
raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM||' -QUERY- '||v_query);
RETURN;
END EMP_BY_JOB;
现在我运行下面的命令只是为了测试我的功能EMP_BY_JOB
select * from table(EMP_BY_JOB) ;
但是,我遇到了数据类型不一致的错误。请帮忙
问题是您的查询选择了正常投影:
select * from temp_table;
这很好,除非您尝试填充一个对象 table。要完成这项工作,您需要 return 来自 temp_table
的数据转换为您的类型。
我不知道你的基础投影 table 所以我猜测列名与类型的属性相匹配。但无论如何,你需要这样的东西:
select user_tmp(tt.id, tt.name, tt.section) from temp_table tt;
顺便说一句,为什么那是一个字符串?您的程序不需要动态 SQL。这也可以。
OPEN v_cursor FOR select user_tmp(tt.id, tt.name, tt.section) from temp_table tt;