1

ALREADY WORKING コードで奇妙な問題に遭遇しました。出力カーソルとしてv_po_reportを返す作業プロシージャpkg_pbrer.p_gen_pbrer_rptがあります。

このカーソルを 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;
4

2 に答える 2

0

オラクルに変換できない可能性のある最近追加されたレコードのカーソルデータを確認してください。たとえば、varchar2を受け入れる列には、オラクルによって数値に変換できる値「1000」がありますが、値「abc」は変換できません。

于 2015-06-03T09:19:46.507 に答える
0

「デュアルから 1 を選択」の v_po_report を開きます。

FETCH v_po_report INTO table_po_report_62;

v_po_report単一の列値 1、つまりNUMBERデータ型を持つ単一の行データセットを指すrefcursorです。まったく異なる構造のレコード タイプにフェッチしようとしている間。

あなたの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>
于 2015-06-03T09:33:20.773 に答える