2013-05-08 3 views
0

J'utilise TOAD pour Oracle 11 et je suis assez nouveau dans SQL. J'ai écrit un proc et j'essaie maintenant de tester et d'afficher sa sortie. J'ai écrit le bloc suivant:PLSQL Affichage de la sortie de 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; 
/

Cependant, je reçois l'erreur suivante sur la ligne de boucle

ORA-01001: curseur invalide

L'erreur est sur la ligne 10 qui est la ligne a "boucle" sur elle

Mon proc ressemble à ce

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

Qu'est-ce que 'procPerfTR'? – FrustratedWithFormsDesigner

+0

C'est le proc que j'appelle. – GreenyMcDuff

+0

Est-ce que cette erreur vous donne un numéro de ligne? Il peut également être utile si vous fournissez le contenu de 'procPerfTR', si ce n'est pas trop de problèmes. – FrustratedWithFormsDesigner

Répondre

0

dans votre proc vocation, ne mettez pas un deux-points devant le nom du curseur. Il devrait ressembler à

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

(Notez aussi que j'ai ajouté une seule citation au début du premier paramètre, dont l'absence je pris pour une simple faute de frappe).

Partagez et appréciez.

Questions connexes