2017-01-24 1 views
1

Bonjour, j'ai déjà créé une procédure Oracle qui n'a que des syndicats avec des sélections. La procédure est créée avec ces paramètres:Obtenir le retour de la procédure oracle

PROCEDURE mp_prov_preview(pDateFrom  IN DATE, 
          pDateTo  IN DATE, 
          preturn_cursor OUT spdutil.tref_cursor) IS 

    v_cursor spdutil.tref_cursor; 

Ce que je ne comprends pas, c'est comment obtenir le jeu de résultats de retour de la procédure. J'utilise pl sql. J'ai essayé de cette façon, et il s'exécute mais le résultat n'est pas affiché.

begin 
    -- Call the procedure 
    mp_prov_preview('01-oct-2016', 
        '31-oct-2016', 
        :preturn_cursor); 
end; 

PS. J'utilise plsql

+0

C'est parce que vous ne faites rien avec le résultat. Dans le cas d'une procédure, le résultat "output" est défini comme paramètres OUT dans votre cas est 'preturn_cursor OUT spdutil.tref_cursor' Après avoir appelé votre procédure, vous devez utiliser cette variable et la boucler dessus. Puisque c'est un résultat de requête avec juste des syndicats. –

Répondre

3

Supposons que vous avez une procédure comme celle-ci:

create or replace procedure cursorOut (pIn IN  number, 
             pOut OUT sys_refcursor 
            ) is 
begin 
    open pOut for select pIn  from dual union 
        select pIn * 100 from dual; 
end; 

En SQLPlus vous pouvez l'appeler avec:

SQL> variable vCurs REFCURSOR 
SQL> exec cursorOut (1, :vCurs); 

PL/SQL procedure successfully completed. 

SQL> print :vCurs 

     :B1 
---------- 
     1 
     100 

Cela suffit d'imprimer le résultat de votre requête; si vous avez besoin de faire quelque chose de plus sur les données renvoyées par votre requête, vous pouvez utiliser un bloc PL/SQL:

declare 
    vCurs sys_refcursor; 
    vVar number; 
begin 
    cursorOut (1, vCurs); 
    loop 
     fetch vCurs 
     into vVar; 
     exit when vCurs%NOTFOUND; 
     dbms_output.put_line(vVar); 
    end loop; 
end; 

deux façons, vous utilisez votre paramètre OUT pour obtenir le curseur construit par votre procédure et vous utilisez ce curseur pour faire quelque chose. La première façon est spécifique au client (j'ai utilisé SQLPlus), et vous donne une variable que vous pouvez facilement imprimer avec la commande PRINT (encore une fois, dans SQLPlus). Dans la deuxième approche, vous disposez d'une variable PL/SQL que vous pouvez utiliser pour créer une boucle et analyser chaque ligne pour effectuer certaines opérations en fonction des données résultantes. Cela ne dépend pas du client, étant donné que n'utilise que PL/SQL.

+0

Vous pouvez ajouter une explication sur le paramètre OUT car il semble que ce soit ce qu'il n'a pas compris. –

+1

Essayer d'expliquer mieux, merci – Aleksej