2009-08-27 3 views
0

J'essaie d'obtenir des résultats d'un SP Oracle qui retourne des curseurs. J'ai le code suivant qui ne semble pas fonctionner ...Récupérer les résultats d'Oracle SP [curseur]

declare VARIABLE csr1 REFCURSOR; 
declare VARIABLE csr2 REFCURSOR; 
declare VARIABLE csr3 REFCURSOR; 
declare VARIABLE csr4 REFCURSOR; 
declare VARIABLE csr5 REFCURSOR; 
EXEC getReportData('PUB',:csr1,:csr2,:csr3,:csr4,:csr5); 
PRINT csr1; 

je regardais autour de SO pour ce type de question et that est là, je suis le code ci-dessus.

Dans cette même réponse, il existe une deuxième option à boucler également. mais cela ne fonctionne pas pour moi depuis que l'une des lignes dans ce code dit:

rej_rec Reasons_for_Rejection%ROWTYPE; 

Reasons_for_Rejection est censé être le nom de la table ... mais dans mon SP qu'ils utilisent une table interne parce que la requête est comme ceci:

select c.blah from (select blah1 from blah) c 

Répondre

2

Vous devriez dire quelque chose de plus spécifique que "ne semble pas fonctionner". Mais la première chose que je vois mal avec votre échantillon est que vous confondez SQLPlus et PL/SQL. Je suppose que vous tapez les commandes ou que vous les exécutez en tant que script dans SQLPlus. "DECLARE" commence un bloc PL/SQL, qui ne sera pas exécuté tant qu'une barre oblique n'est pas entrée sur une nouvelle ligne. Donc, si vous tapez ces commandes de manière interactive, il est probablement juste vous demander plus d'entrée:

SQL> declare VARIABLE csr1 REFCURSOR; 
    2 declare VARIABLE csr2 REFCURSOR; 
    3 declare VARIABLE csr3 REFCURSOR; 
    4 declare VARIABLE csr4 REFCURSOR; 
    5 declare VARIABLE csr5 REFCURSOR; 
    6 EXEC getReportData('PUB',:csr1,:csr2,:csr3,:csr4,:csr5); 
    7 PRINT csr1; 
    8/
SP2-0552: Bind variable "CSR5" not declared. 
SQL> 

Les autres commandes que vous essayez d'utiliser les commandes sont SQLPlus. La commande VARIABLE déclare une variable de liaison dans SQLPlus - elle n'implique pas du tout un mot clé DECLARE. Donc, vous devriez essayer ceci:

VARIABLE csr1 REFCURSOR; 
VARIABLE csr2 REFCURSOR; 
VARIABLE csr3 REFCURSOR; 
VARIABLE csr4 REFCURSOR; 
VARIABLE csr5 REFCURSOR; 
EXEC getReportData('PUB',:csr1,:csr2,:csr3,:csr4,:csr5); 
PRINT csr1; 

Je ne comprends pas vraiment le point du reste de votre question. Une déclaration% ROWTYPE ne signifie pas que l'enregistrement doit être rempli directement à partir de la table donnée, mais simplement que ses champs et leurs types correspondent à ceux d'une ligne de la table. Ces champs peuvent être référencés et assignés comme n'importe quelle autre variable.

0

Vous n'avez pas besoin de DECLARE si vous utilisez SQL * Plus.

Comme vous ne nous donnez aucun détail, il est difficile de savoir pourquoi votre code ne fonctionne pas. Mais c'est le genre de chose que vous devez être en train de faire:

SQL> create or replace procedure getReportData 
    2  (dno in dept.deptno%type 
    3  , d_recs out sys_refcursor 
    4  , e_recs out sys_refcursor) 
    5 is 
    6 begin 
    7  open d_recs for 
    8   select * from dept where deptno = dno; 
    9  open e_recs for 
10   select * from emp where deptno = dno; 
11 end; 
12/

Procedure created. 

SQL> var rc1 refcursor 
SQL> var rc2 refcursor 
SQL> 
SQL> exec getReportData (30, :rc1, :rc2) 

PL/SQL procedure successfully completed. 

SQL> 
SQL> print rc1 

    DEPTNO DNAME   LOC 
---------- -------------- ------------- 
     30 SALES   CHICAGO 

SQL> print rc2 

    EMPNO ENAME  JOB    MGR HIREDATE   SAL  COMM 
---------- ---------- --------- ---------- --------- ---------- ---------- 
    DEPTNO 
---------- 
     7499 VAN WIJK SALESMAN  7698 20-FEB-81  1600  300 
     30 

     7521 PADFIELD SALESMAN  7698 22-FEB-81  1250  500 
     30 

     7654 BILLINGTON SALESMAN  7698 28-SEP-81  1250  1400 
     30 


     7698 SPENCER MANAGER   7839 01-MAY-81  2850 
     30 

     7900 HALL  CLERK   7698 03-DEC-81  950 
     30 

SQL>

Questions connexes