2015-06-03 37 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乐。例如列接受varchar2具有值'1000'能够由oracle转换为数字,但值'abc'不能。

+0

感谢您的建议。我将尝试分析过程中由SQL呈现给引用游标的列。 – Abhishek

0

打开v_po_report'select 1 from dual';

FETCH v_po_report INTO table_po_report_62;

v_po_reportREFCURSOR它指向一个单列数据集与单独列的值1,即NUMBER数据类型。当您试图获取具有完全不同结构的记录类型时。

您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

谢谢你的Lalit。但程序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); 会覆盖参考光标的前一个值,并且在此行之前不会遇到错误。 – Abhishek

+0

@Abhishek请发布返回refcursor的包所需的内容。 –