0

私は Oracle 11 に TOAD を使用していますが、SQL は初めてです。proc を作成し、その出力をテストして表示しようとしています。次のブロックを書きました。

DECLARE
    cur_test SYS_REFCURSOR;

    type t_row is record(psh_code varchar2(20) , pattr_end_date varchar2(20),     pperf_gross varchar2(20));
    r_test t_row;
BEGIN

    procPerfTR(xxx-xxxx', 'xxxxxxx', 'xxxxxxx', 'xxxxxx', :cur_test);
    LOOP
        FETCH cur_test INTO r_test;

        EXIT WHEN cur_test%NOTFOUND;
    END LOOP;

    CLOSE cur_test;
END;
/

ただし、LOOP行で次のエラーが発生します

ORA-01001: カーソルが無効です

エラーは、「LOOP」がある行である行 10 にあります。

私のprocは次のようになります

CREATE OR REPLACE PROCEDURE procPerfTR

(
    paramPortfCode VARCHAR2, 
    paramEndDate VARCHAR2, 
    paramShare VARCHAR2,
    paramFreq VARCHAR2,

    O_cursorPerf out SYS_REFCURSOR
)

IS

    I_cursorPerf SYS_REFCURSOR;

BEGIN

    OPEN I_cursorPerf FOR
    SELECT PS.PSH_CODE, PP.PATTR_END_DATE, PP.PPERF_GROSS
    FROM
        PORTFOLIO_PERFORMANCES PP
        INNER JOIN PORTF_SHARE PS ON PS.PORTF_SHARE_ID = PP.PORTF_SHARE_ID
        INNER JOIN PORTFOLIO P ON P.PORTF_ID = PS.PORTF_ID
        INNER JOIN T_FREQUENCY TF ON TF.FREQUENCY_ID = PP.FREQUENCY_ID
    WHERE
        P.PORTF_CODE = paramPortfCode
        AND PP.PATTR_CALCUL_DATE = PP.PATTR_END_DATE
        AND PP.PATTR_END_DATE = paramEndDate
        AND TF.EXT_CODE = paramFreq
        AND PS.PSH_CODE LIKE
            (CASE 
                WHEN paramShare = 'xxxx' THEN '%xxx'
                WHEN paramShare = 'xxxx' THEN '%xxx'
            END);

    O_cursorPerf:=I_cursorPerf;

END;
/
4

1 に答える 1

0

proc の呼び出しでは、カーソルの名前の前にコロンを付けないでください。次のように見えるはずです

procPerfTR('xxx-xxxx', 'xxxxxxx', 'xxxxxxx', 'xxxxxx', cur_test);

(最初のパラメーターの先頭に一重引用符を追加したことにも注意してください。これがないのは単純なタイプミスだと思います)。

共有してお楽しみください。

于 2013-05-08T16:21:57.290 に答える