我已经创建了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
表数据的函数
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) ;
但是,我收到不一致的数据类型错误。请帮助
答案 0 :(得分:2)
问题是您的查询选择了普通投影:
select * from temp_table;
除了尝试填充对象表外,哪种还可以。为了完成这项工作,您需要将temp_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;