2013-05-08 237 views
0

我对Oracle 11使用TOAD,对SQL来说很新颖。我写了一个proc,现在正在试图测试和查看它的输出。我写了下面的块:PLSQL查看sys_refcursor的输出结果

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; 
/

但是,我上环行线以下错误

ORA-01001:无效光标

的错误是在第10行这是行上有 “LOOP”

我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; 
/
+0

什么是'procPerfTR'? – FrustratedWithFormsDesigner 2013-05-08 15:39:45

+0

这是我打电话的过程。 – GreenyMcDuff 2013-05-08 15:52:11

+0

这个错误会给你一个行号吗?如果你提供了'procPerfTR'的内容,如果没有太多的麻烦,它可能也会有所帮助。 – FrustratedWithFormsDesigner 2013-05-08 16:20:29

回答

0

在你在PROC职业,不要在游标的名称前加冒号。它应该看起来像

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

(另请注意,我在第一个参数的开始增加了一个单引号,没有我把它的是一个简单的拼写错误)。

分享和享受。