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;