【问题标题】:ORA-00932 in cursor fetchORA-00932 在游标提取中
【发布时间】:2015-06-03 09:08:33
【问题描述】:

我在 ALREADY WORKING 代码中遇到了一个奇怪的问题。 有一个工作过程 pkg_pbrer.p_gen_pbrer_rpt 返回 v_po_report 作为输出游标。

我正在尝试将此光标捕获到 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;

【问题讨论】:

  • v_po_report 是一个 refcursor,它指向具有 单列值为 1单行 数据集,即NUMBER 数据类型。当您尝试获取具有完全不同结构的记录类型时。

标签: oracle ora-00932


【解决方案1】:

检查您的游标数据中是否有最近添加的记录,这些记录对于 oracle 可能是不可转换的。例如,接受 varchar2 的列的值 '1000' 能够通过 oracle 转换为数字,但值 'abc' 不能。

【讨论】:

  • 感谢您的建议。我将尝试分析过程中的 SQL 呈现给 ref 游标的列。
【解决方案2】:

打开 v_po_report for 'select 1 from dual';

FETCH v_po_report INTO table_po_report_62;

v_po_report 是一个refcursor,它指向一个单行数据集,单列值为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>

【讨论】:

  • 感谢拉利特。但是程序 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 cursor 的先前值,直到这一行没有遇到错误。
  • @Abhishek 请发布返回refcursor的包的所需内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-09
  • 1970-01-01
  • 2012-06-22
  • 2018-12-03
相关资源
最近更新 更多