IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Utilisation des REF_CURSOR


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2010
    Messages : 48
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    C'est ça que tu souhaites faire je pense :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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>

  3. #3
    Membre averti
    Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2010
    Messages : 48
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  4. #4
    Membre éprouvé
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Par défaut
    Citation Envoyé par complicated Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from table(z_test_refcursor( p_Debug))
    )

    @+

Discussions similaires

  1. Règles d'utilisation des forums C
    Par Franck.H dans le forum C
    Réponses: 3
    Dernier message: 26/01/2008, 17h35
  2. [CR8.5] Utilisation des codes barre
    Par Robert dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 20/01/2005, 16h13
  3. utilisation des sockets sous windows
    Par Tupac dans le forum Réseau
    Réponses: 2
    Dernier message: 21/12/2002, 18h24
  4. [Crystal Report] Utilisation des vues de sql serveur
    Par Olivierakadev dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 15/11/2002, 17h44
  5. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo