Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/11/2011, 22h49   #1
Invité de passage
 
BASTI
Consultant informatique
Inscription : juin 2010
Messages : 42
Détails du profil
Informations personnelles :
Nom : BASTI
Localisation : France

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : juin 2010
Messages : 42
Points : 3
Points : 3
Par défaut Utilisation des REF_CURSOR

Bonsoir,
le code suivant permet de déclarer un curseur et faire la sélection de la table "bulletin"
Code :
1
2
3
4
5
6
7
8
9
10
11
   Declare
                  cursor   sel_bulletin( this_cod_co       IN number
                                       , this_num_bulletin IN varchar2
                                       ) IS 
                           SELECT cod_bulletin
                           FROM   bulletin 
                           WHERE  cod_co       = this_cod_co
                             AND  num_bulletin = this_num_bulletin;
               Begin
                  open  sel_bulletin( g_Cod_CO, s_num_bulletin );
                  fetch sel_bulletin INTO n_cod_Bulletin;
je cherche à utiliser le ref cursor.
ci-dessous une procédure que j'ai créée, le curseur fera la sélection selon le contenu de la variable "P_debug", si elle est true la sélection sera à partir de la table temporaire "tmp_bulletin", sinon la sélection sera à partir de la table "Bulletin"

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
CREATE OR REPLACE
procedure                  z_test_refcursor( p_Debug BOOLEAN DEFAULT false ) IS
 
    TYPE RefCur_Bulletin IS REF CURSOR RETURN Bulletin%ROWTYPE;
    c_cursor        RefCur_Bulletin;
    rec_bulletin    c_cursor%rowtype;
 
    p_cod_co        number := 12;
begin
    --
    -- Open Cursor par sélection
    --
    IF ( p_Debug ) Then
        open c_cursor
         FOR SELECT *
             FROM   tmp_bulletin
             WHERE  cod_co       = p_cod_co;
    Else
        open c_cursor
         FOR SELECT *
             FROM   bulletin
             WHERE  cod_co       = p_cod_co;
    end IF;
    --
    --     
    loop
        fetch c_cursor INTO rec_bulletin;
        exit when c_cursor%notfound;
        dbms_output.put_line( rec_bulletin.num_bulletin );
    end loop;
    --
    -- Fermeture du cursor
    close c_cursor;
End;
le problème, c'est que je n'arrive pas à appeler cette procédure dans la partie du code N°1 pour que si je suis en mode debug je fais la sélection depuis la table "tmp_bulletin" si non je le fais de la table "bulletin", la syntaxe que j'ai utilisée n'était pas correcte, il y a toujours des erreurs et je suis bloqué.
votre aide sera fortement appréciée.
Merci.
complicated est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 01h37   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
C'est ça que tu souhaites faire je pense :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
SQL> CREATE TABLE emp AS SELECT * FROM scott.emp;
 
TABLE created.
 
SQL> CREATE TABLE tmp_emp AS SELECT * FROM emp WHERE ename = 'KING';
 
TABLE created.
 
SQL> 
SQL> CREATE OR REPLACE procedure p (p_debug IN BOOLEAN)
  2  AS
  3    cur sys_refcursor;
  4    rec_emp emp%rowtype;
  5  begin
  6    IF (p_debug) then
  7      open cur FOR SELECT * FROM emp;
  8    else
  9      open cur FOR SELECT * FROM tmp_emp;
 10    end IF;
 11    loop fetch cur INTO rec_emp;
 12    exit when cur%notfound;
 13      dbms_output.put_line(rec_emp.ename);
 14    end loop;
 15    close cur;
 16  end;
 17  /
 
Procedure created.
 
SQL> 
SQL> exec p(TRUE);
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
 
PL/SQL procedure successfully completed.
 
SQL> exec p(FALSE);
KING
 
PL/SQL procedure successfully completed.
 
SQL>
Mais j'espère que tu as besoin de faire des choses dans le loop car si c'est juste pour de l'affichage utilise print dans sqlplus ou sqldeveloper c'est beaucoup plus flexibe :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
SQL> CREATE OR REPLACE procedure p1 (p_debug IN BOOLEAN, cur out sys_refcursor)
  2  AS
  3  begin
  4    IF (p_debug) then
  5      open cur FOR SELECT * FROM emp;
  6    else
  7      open cur FOR SELECT * FROM dept;
  8    end IF;
  9  end;
 10  /
 
Procedure created.
 
SQL> 
SQL> var rc refcursor
SQL> exec p1(TRUE, :rc);
 
PL/SQL procedure successfully completed.
 
SQL> print :rc;
 
     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-DEC-80        800                    20
      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
      7566 JONES      MANAGER         7839 02-APR-81       2975                    20
      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30
      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10
      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20
      7839 KING       PRESIDENT            17-NOV-81       5000                    10
      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30
      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20
 
     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7900 JAMES      CLERK           7698 03-DEC-81        950                    30
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10
 
14 rows selected.
 
SQL> exec p1(FALSE, :rc);
 
PL/SQL procedure successfully completed.
 
SQL> print :rc;
 
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
 
SQL>
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 15h28   #3
Invité de passage
 
BASTI
Consultant informatique
Inscription : juin 2010
Messages : 42
Détails du profil
Informations personnelles :
Nom : BASTI
Localisation : France

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : juin 2010
Messages : 42
Points : 3
Points : 3
Bonjour, merci pour la réponse, mais le 1er script est une infime partie de tout un package. Est-ce que la procédure "z_test_refcursor" dans le 2eme script qui retourne le contenu de la table "Bulletin" ou "tmp_bulletin" (sa dépend du mode debug ou pas) peut être affecté à une variable ou utilisé dans le 1er script genre:
Code :
1
2
3
4
5
6
7
8
9
10
11
Declare
                  cursor   sel_bulletin( this_cod_co       IN number
                                       , this_num_bulletin IN varchar2
                                       ) IS 
                           SELECT cod_bulletin
                           FROM   z_test_refcursor( p_Debug)
                           WHERE  cod_co       = this_cod_co
                             AND  num_bulletin = this_num_bulletin;
               Begin
                  open  sel_bulletin( g_Cod_CO, s_num_bulletin );
                  fetch sel_bulletin INTO n_cod_Bulletin;
j'ai essayé de le faire mais ça ne marche pas.

Merci pour l'aide, je suis bloqué sur ce sujet
complicated est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2011, 01h06   #4
Membre Expert
 
Avatar de Sunchaser
 
Homme Vincent
OPNI
Inscription : décembre 2004
Messages : 1 668
Détails du profil
Informations personnelles :
Nom : Homme Vincent
Âge : 41
Localisation : France, Manche (Basse Normandie)

Informations professionnelles :
Activité : OPNI
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : décembre 2004
Messages : 1 668
Points : 2 036
Points : 2 036
Citation:
Envoyé par complicated Voir le message
Code :
1
2
3
4
5
6
7
8
9
10
11
Declare
                  cursor   sel_bulletin( this_cod_co       IN number
                                       , this_num_bulletin IN varchar2
                                       ) IS 
                           SELECT cod_bulletin
                           FROM   z_test_refcursor( p_Debug)
                           WHERE  cod_co       = this_cod_co
                             AND  num_bulletin = this_num_bulletin;
               Begin
                  open  sel_bulletin( g_Cod_CO, s_num_bulletin );
                  fetch sel_bulletin INTO n_cod_Bulletin;
Bonsoir,
A voir cela, j'aurais tendance a dire que tu aurais besoin d'une fonction table, qui te renverrais les enregistrements soit de la table bulletin soit tmp_bulletin, en fonction du paramètre passé.
(que tu pourrais appeler via un
Code :
select * from table(z_test_refcursor( p_Debug))
)

@+
__________________
Citation:
Aux persévérants aucune route n'est interdite
Question: un ver a pied, c'est un millepatte unijambiste ?

Mon dernier trip musical

Citation:
Quiconque construit un jardin devient un allié de la lumière, aucun jardin n'étant jamais surgi des ténèbres
A priori un proverbe Perse ...
Sunchaser est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h53.


 
 
 
 
Partenaires

Hébergement Web