7

Oracle SQL Developer を使用していますが、ref カーソルを返すパッケージからの結果を表示する際に問題が発生しています。以下はパッケージ定義です。

CREATE OR REPLACE package instance.lswkt_chgoff_recov
as
      type rec_type is record
            (
            source_cd                       lswk_tpr.gltrans.tpr_source_cd%TYPE,
            as_of_dt                        lswk_tpr.gltrans.tpr_as_of_dt%TYPE,
            chrg_off_recov                  varchar2(5),
            process_dt                      lswk_tpr.gltrans.dtgltran%TYPE,
            effect_dt                       lswk_tpr.gltrans.dtgltran%TYPE,
            account_nbr                     lswk_tpr.contract.lcontid%TYPE,
            naics_cd                        lswk_tpr.udfdata.sdata%TYPE,
            prod_type                       varchar2(20),
            off_nbr                         lswk_tpr.schedule.sctrcdty%TYPE,
            borrower_nm                     lswk_tpr.customer.scustnm%TYPE,
            tran_type_cd                    lswk_tpr.gltrans.sglcd%TYPE,
            tran_type_desc                  lswk_tpr.gltrans.sglcd%TYPE,
            tran_amt                        lswk_tpr.gltrans.ctranamt%TYPE,
            note_dt                         lswk_tpr.schedule.dtbk%TYPE,
            accru_cd                        number,
            non_accr_cd                     lswk_tpr.schedule.dtlstincsus%TYPE,
            comm_sb_ind                     varchar2(4)
            );

      type cur_type is ref cursor return rec_type;

      procedure sp
            (
            p_as_of_dt              in      date,
            ref_cur                 in out  cur_type
            );
end;
/

問題はこれが可能だと思います。もしそうなら、私は何をする必要がありますか。Oracle SQL Developer 1.5.5 を使用しています。ありがとう。

ウェイド

パッケージを呼び出すために使用したコードは次のとおりです (TOAD によって生成されます)。

DECLARE 
  P_AS_OF_DT DATE;
  REF_CUR instance.LSWKT_CHGOFF_RECOV.CUR_TYPE;
  REF_CUR_row REF_CUR%ROWTYPE;

BEGIN 
  P_AS_OF_DT := '31-AUG-2009';

  instance.LSWKT_CHGOFF_RECOV.SP ( P_AS_OF_DT, REF_CUR );

  DBMS_OUTPUT.Put_Line('REF_CUR =');
  IF REF_CUR%ISOPEN THEN
  DBMS_OUTPUT.Put_Line('  SOURCE_CD  AS_OF_DT  CHRG_OFF_RECOV  PROCESS_DT  EFFECT_DT  ACCOUNT_NBR  NAICS_CD  PROD_TYPE  OFF_NBR  BORROWER_NM  TRAN_TYPE_CD  TRAN_TYPE_DESC  TRAN_AMT  NOTE_DT  ACCRU_CD  NON_ACCR_CD  COMM_SB_IND');
    LOOP
      FETCH REF_CUR INTO REF_CUR_row;
      EXIT WHEN REF_CUR%NOTFOUND;
      DBMS_OUTPUT.Put_Line(
           '  ' || '[TPR_SOURCE_CD%type]'
        || '  ' || '[TPR_AS_OF_DT%type]'
        || '  ' || '''' || REF_CUR_row.CHRG_OFF_RECOV || ''''
        || '  ' || '[DTGLTRAN%type]'
        || '  ' || '[DTGLTRAN%type]'
        || '  ' || '[LCONTID%type]'
        || '  ' || '[SDATA%type]'
        || '  ' || '''' || REF_CUR_row.PROD_TYPE || ''''
        || '  ' || '[SCTRCDTY%type]'
        || '  ' || '[SCUSTNM%type]'
        || '  ' || '[SGLCD%type]'
        || '  ' || '[SGLCD%type]'
        || '  ' || '[CTRANAMT%type]'
        || '  ' || '[DTBK%type]'
        || '  ' || NVL(TO_CHAR(REF_CUR_row.ACCRU_CD), 'NULL')
        || '  ' || '[DTLSTINCSUS%type]'
        || '  ' || '''' || REF_CUR_row.COMM_SB_IND || '''');
    END LOOP;
  ELSE
    DBMS_OUTPUT.Put_line('  (Ref Cursor is closed)');
  END IF;


  COMMIT; 
END;

エラーが発生します:

ORA-06502: PL/SQL: 数値または値のエラー

これでもう少しすっきりすることを願っています。

4

6 に答える 6

13

SQL Developer で ref_cursor の出力結果を簡単に印刷して、戻り値を確認できます。

Refcursor 関数の例を次に示します。

create or replace function get_employees() return sys_refcursor as
  ret_cursor sys_refcursor;
begin
  open ret_cursor for
    select * from employees;
  return ret_cursor; 
end get_employees;

手っ取り早い方法:

select get_employees() from dual; 

きちんと整頓された方法:

variable v_ref_cursor refcursor;
exec :v_ref_cursor := get_employees(); 
print :v_ref_cursor
于 2010-03-03T05:28:38.440 に答える
8

proc の署名に refcursor が必要なプロシージャがある場合は、次のようにすることができます。

var rc refcursor;
execute <package>.my_proc(:rc);
print rc;

強調表示して F5 を押します。

于 2011-06-01T14:45:58.650 に答える
1

あなたのコメントであなたはここにエラーがあると言います:

ORA-06502:PL / SQL:数値または値のエラーORA-06512:16行目

時々どのように見えても、PL/SQLエラーはランダムに生成されません。このエラーは、プロシージャの16行目で発生する欠陥のあるデータ型変換を示しています。手順全体を確認しないと、16行目を正確に特定することはできません。幸い、SQLDeveloperのコードエディタは行番号をガターに配置します。行番号が表示されない場合は、設定を切り替える必要があります。

探す必要があるのは、数値または日付変数にキャストされている文字列、または日付フィールドにキャストされている数値です。これは、明示的なTO_NUMBER()またはTO_DATEによって通知される場合があります。その場合、フォーマットマスクやデータコンテンツを確認する必要があります。または、暗黙のキャストがある場合もあります。その場合、適切なフォーマットマスクを使用して明示的にする必要があります。もちろん、SELECTステートメントの射影がREF CURSORレコードの署名と一致しないため、偶発的で不要な変換である可能性があります。それは簡単に修正できます。

于 2010-03-03T06:14:25.557 に答える
1

生成されたプログラムに表示される唯一の明示的な値は

 P_AS_OF_DT := '31-AUG-2009';

明示的な変換を試してください (to_date ('31-AUG-2009', 'DD-MON-YYYY')代わりに、問題が解決される可能性があります。

それでも問題が解決しない場合は、エラーが SP またはコードで生成されているかどうかを確認できますか? これを直接把握できない場合は、コードから sp を定義し、ブレークポイントを設定してコードをステップ実行し、エラーの原因を確認します。

于 2009-10-29T22:59:35.687 に答える
0

カーソルのクエリが何であるかを見ずに判断する方法はありません。プロシージャ SP で実行している SELECT ステートメントを見てください。rec_type の数値フィールドに選択している列の 1 つが、数値に変換できない文字データを返しています。

カーソルを出力する方法を理解しようとする代わりに、sp から SELECT ステートメントを取得して、スタンドアロンで実行します。得られた結果を見下ろします。数字が期待されるフィールドの 1 つに返される数字以外の値を探します。

于 2009-11-05T18:53:51.750 に答える
0

返された参照カーソルを反復するループを作成するだけです。DBMS_OUTPUT.PUT_LINE()表示する特定のフィールドを使用および選択して、コンソールに出力できます。

于 2009-10-29T19:11:59.527 に答える