ORA-00932: несовместимые типы данных: ожидаемые - полученные - при выполнении функции - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть 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 голосов
/ 20 декабря 2018

Проблема в том, что ваш запрос выбирает нормальную проекцию:

 select * from temp_table;

Это нормально, если вы не пытаетесь заполнить таблицу объектов.Для этого вам нужно вернуть данные из temp_table cast в ваш тип.

Я не знаю проекцию вашей базовой таблицы, поэтому предположу, что имена столбцов соответствуют атрибутам типа.Но что угодно, вам нужно что-то вроде этого:

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;
...