2015-06-03 2 views
1

У меня возникла странная проблема в коде «УЖЕ РАБОТА». Выполняется рабочая процедура pkg_pbrer.p_gen_pbrer_rpt, которая возвращает v_po_report как выходной курсор.ORA-00932 в выборке курсора

Я пытаюсь захватить этот курсор в table_po_report_62, и это работает нормально.

Теперь я столкнулся ошибка

ORA-00932: несовместимые типы данных:. Ожидается, - получил -»в курсоре принести заявления

Для простоты понимания, я опущено ненужные строки кода.

DECLARE 

    v_po_report SYS_REFCURSOR; 

    TYPE type_po_report_62 IS RECORD (soc varchar2(1000), pt varchar2(1000), mp varchar2(1000), 
            blind varchar2(1000), ac varchar2(1000), placebo varchar2(1000)); 

    table_po_report_62 type_po_report_62; 
    -- 
    -- 
    -- Some working code 
    -- 
    -- 


    -- Initializing Reference cursor  
    open v_po_report for 'select 1 from dual'; 

    pkg_pbrer.p_gen_pbrer_rpt (v_user_id,v_report_type,v_report_form_id,v_reg_report_id,v_po_report,v_po_case_list); 

    LOOP 
     FETCH v_po_report INTO table_po_report_62; 
     -- Encountered ORA-00932: inconsistent datatypes: expected - got - 
     EXIT WHEN v_po_report%NOTFOUND; 
     insert into pbrer_output62_report (soc, pt, mp, blind, ac, placebo) 
     values (table_po_report_62.soc, table_po_report_62.pt, table_po_report_62.mp, table_po_report_62.blind, table_po_report_62.ac, table_po_report_62.placebo) ; 
    END LOOP; 
    CLOSE v_po_report; 

EXCEPTION 
WHEN OTHERS THEN 
    -- 
    -- 
    -- Some working code 
    -- 
    -- 
END; 
+0

'v_po_report' является ** REFCURSOR * *, который указывает на набор данных ** с одной строкой ** с ** единственным значением столбца 1 **, т.е. ** типом данных ** NUMBER **. Пока вы пытаетесь ввести ** тип записи ** с совершенно другой структурой. –

ответ

0

Проверьте данные курсора на недавно добавленные записи, которые могут быть неконвертируемыми для orac ле. для exmaple столбца accept varchar2 имеет значение «1000», способное преобразовать oracle в число, но значение «abc» не имеет.

+0

Спасибо за предложение. Я попытаюсь проанализировать столбцы, отображаемые курсором ref SQL внутри процедуры. – Abhishek

0

open v_po_report для 'select 1 from dual';

FETCH v_po_report INTO table_po_report_62;

v_po_report является REFCURSOR, который указывает на один ряд набора данных с одного значение столбца 1, т.е. НОМЕР типа в данных. Пока вы пытаетесь забрать тип записи с совершенно другой структурой.

Вы REFCURSOR в основном возвращает:

SQL> var v_po_report refcursor 
SQL> declare 
    2 v_po_report SYS_REFCURSOR; 
    3 BEGIN 
    4 OPEN :v_po_report FOR 'select 1 from dual'; 
    5 END; 
    6/

PL/SQL procedure successfully completed. 

SQL> print v_po_report 

     1 
---------- 
     1 

SQL> 

Таким образом, при правильной игре числа столбцов и типов данных, вы можете сделать это, как:

SQL> DECLARE 
    2 v_po_report SYS_REFCURSOR; 
    3 TYPE type_po_report_62 IS RECORD (soc NUMBER); 
    4 table_po_report_62 type_po_report_62; 
    5 BEGIN 
    6 OPEN v_po_report FOR 'select 1 from dual'; 
    7 LOOP 
    8  FETCH v_po_report INTO table_po_report_62; 
    9  EXIT WHEN v_po_report%NOTFOUND; 
10 
11  -- do something 
12 
13 END LOOP; 
14 CLOSE v_po_report; 
15 END; 
16/

PL/SQL procedure successfully completed. 

SQL> 
+0

Спасибо, что Лалит. Но процедура pkg_pbrer.p_gen_pbrer_rpt (v_user_id, v_report_type, v_report_form_id, v_reg_report_id, v_po_report, v_po_case_list); перезаписывает предыдущее значение курсора ref, и до этой строки не встречается ошибка. – Abhishek

+0

@Abhishek Пожалуйста, разместите требуемый контент пакета, который возвращает refcursor. –

Смежные вопросы