ORA-00932:数据类型不一致:预期-执行功能时得到-

时间:2018-12-19 19:06:51

标签: sql oracle oracle11g user-defined-types

我已经创建了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) ;

但是,我收到不一致的数据类型错误。请帮助

1 个答案:

答案 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;