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

Oracle Discussion :

[PL/SQL] Stockage d'un select [Débutant(e)]


Sujet :

Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 104
    Points : 64
    Points
    64
    Par défaut [PL/SQL] Stockage d'un select
    Bonjour,


    je cherche à faire une première procédure P1 qui fera la requete :

    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
     
     
    PROCEDURE P_GET_ETAB_STOCK_RESTE (PO_CUR OUT,
                                      PDI_JOURNEE_POSTALE IN DATE)
    IS
     
    BEGIN
     
    	-- recuperation de la liste des etablissement
            SELECT DISTINCT(CTC.code_ctc ),
                   CTC.libelle_ctc,
                   CTC.id_ctc
            FROM CTC, STOCK_ETABLISSEMENT se, STOCK_MACRO_PT smp
            WHERE CTC.id_ctc = se.id_ctc
              AND (smp.stock != 0 OR smp.reste_en_coupure != 0)
              AND smp.id_stock_etablissemen = se.id_stock_etablissemen
              AND se.journee_postale = PDI_JOURNEE_POSTALE
              AND CTC.date_suppression IS NULL
              AND se.date_suppression IS NULL;
     
    END P_GET_ETAB_STOCK_RESTE;

    Et je cherche à stocker les éléments dans un objet. afin de récupérer ces éléments dans une deuxième procédure P2 et de faire un loop sur le retour de P1.

    Est ce possible? J'avais pensé avec un cursor mais ca n'a pas l'air de foncttionner car mon select renvoit plusieurs champs...

  2. #2
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Je ne comprends pas ton problème et je ne vois pas l'intérêt de passer par une procédure P1. Pour quoi ne pas faire directement un curseur dans ta procédure P2 ?
    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
    procedure P2 is
    cursor C_GET_ETAB_STOCK_RESTE (PDI_JOURNEE_POSTALE IN DATE) is
       SELECT DISTINCT(CTC.code_ctc ), 
                   CTC.libelle_ctc, 
                   CTC.id_ctc 
            FROM CTC, STOCK_ETABLISSEMENT se, STOCK_MACRO_PT smp 
            WHERE CTC.id_ctc = se.id_ctc 
              AND (smp.stock != 0 OR smp.reste_en_coupure != 0) 
              AND smp.id_stock_etablissemen = se.id_stock_etablissemen 
              AND se.journee_postale = PDI_JOURNEE_POSTALE 
              AND CTC.date_suppression IS NULL 
              AND se.date_suppression IS NULL; 
    begin
      for v_ETAB_STOCK_RESTE in C_GET_ETAB_STOCK_RESTE (sysdate) loop
      ...
      end loop;
    end;

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 104
    Points : 64
    Points
    64
    Par défaut
    Pour des raisons d'optimisation et de non redondance du code. En fait cette procédure va être appellée par plusieurs autres procédures

  4. #4
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Une table temporaire ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 104
    Points : 64
    Points
    64
    Par défaut
    Il n'y a pas d'autres moyen qu'une table temporaire... Avec les cursors c pas possible???

  6. #6
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    ou un package où tu déclares tous tes curseurs en entête
    => pas de redondance du code
    => ils peuvent être appelés de n'importe quelle procédure.

    Sinon après tu as toujours les ref cursors.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 104
    Points : 64
    Points
    64
    Par défaut
    En fait moi j'avais essayé ca :

    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
     
    TYPE r_cursor IS REF CURSOR;
     
    PROCEDURE P_GET_ETAB_STOCK_RESTE (PO_CUR OUT Pkg_Tb_Reste.r_cursor,
                                      PDI_JOURNEE_POSTALE IN DATE)
    IS
    	v_cur Pkg_Tb_Reste.r_cursor;
    BEGIN
    	OPEN v_cur FOR
    	-- recuperation de la liste des etablissement
            SELECT DISTINCT(CTC.code_ctc ),
                   CTC.libelle_ctc,
                   CTC.id_ctc
            FROM CTC, STOCK_ETABLISSEMENT se, STOCK_MACRO_PT smp
            WHERE CTC.id_ctc = se.id_ctc
              AND (smp.stock != 0 OR smp.reste_en_coupure != 0)
              AND smp.id_stock_etablissemen = se.id_stock_etablissemen
              AND se.journee_postale = PDI_JOURNEE_POSTALE
              AND CTC.date_suppression IS NULL
              AND se.date_suppression IS NULL;
    	PO_CUR := v_cur;
    END P_GET_ETAB_STOCK_RESTE;

    Que j'avais vu sur un exemple. Mais quelle est la différence entre un ref cursor et un cursor. Et comment je vais ensuite dans ma procédure 2 pour parcourir les éléments de mon curseur. Je n'y suis pas arrivé.

  8. #8
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Voici un exemple d'utilisation des ref cursor :
    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
    create or replace package pack1 is
      type t_curs is ref cursor;
     
      procedure recherche_dispo (p_choix in varchar2, c_matable out t_curs);
      procedure affiche_dispo (p_choix in number);
     
    end;
    /
    create or replace package body pack1 is
     
    procedure recherche_dispo (p_choix in number,
                             c_matable out t_curs) is
    begin
       if p_choix = 1 then
          open c_matable for select libelle1 from matable1; 
       elsif p_choix = 2 then
          open c_matable for select libelle2 from matable2; 
       end if;
    end;
     
    procedure affiche_dispo (p_choix in number) is
       c_curs t_curs;
       v_lib varchar2(100);
    begin
       proc1(p_choix, c_curs);
       loop
          fetch c_curs into v_lib;
       exit when c_curs%notfound;
          dbms_output.put_line (v_lib);
       end loop;
       close c_curs;
    end; 
     
    end;
    /
    Les ref cursors sont également appelés curseurs variables en opposition aux curseurs statiques.

    Dans ton cas, il me semble que déclarer en entête de package tous les curseurs dont tu as besoin serait plus simple et plus adapté que d'utiliser des ref cursors.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 104
    Points : 64
    Points
    64
    Par défaut
    Dans ton exemple ton select ne renvoit qu'un seul élément est ce que ca marche pareil pour plusieurs éléments

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 104
    Points : 64
    Points
    64
    Par défaut
    Je ne peux pas les définir pour le package global, car en fonction de la procédure qu'il l'appelle, je passe des paramètre différents

  11. #11
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Oui cela marche avec plusieurs élements aussi :
    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
    create or replace package pack1 is 
      type t_curs is ref cursor; 
     
      procedure recherche_dispo (p_choix in varchar2, c_matable out t_curs); 
      procedure affiche_dispo (p_choix in number); 
     
    end; 
    / 
    create or replace package body pack1 is 
     
    procedure recherche_dispo (p_choix in number, 
                             c_matable out t_curs) is 
    begin 
       if p_choix = 1 then 
          open c_matable for select code1, libelle1 from matable1; 
       elsif p_choix = 2 then 
          open c_matable for select code2, libelle2 from matable2; 
       end if; 
    end; 
     
    procedure affiche_dispo (p_choix in number) is 
       c_curs t_curs; 
       v_lib varchar2(100); 
       v_code varchar2(30);
    begin 
       proc1(p_choix, c_curs); 
       loop 
          fetch c_curs into v_code, v_lib; 
       exit when c_curs%notfound; 
          dbms_output.put_line (v_code || ' - ' || v_lib); 
       end loop; 
       close c_curs;
    end; 
     
    end;
    /

    Citation Envoyé par lapartdombre
    Je ne peux pas les définir pour le package global, car en fonction de la procédure qu'il l'appelle, je passe des paramètre différents
    D'où la nécessité de bien spécifier son problème dès le départ pour ne pas avoir des propositions de solutions inadéquates.

    [EDIT]
    Qu'appelles-tu des paramètres différents ? Faisant référence à des colonnes différentes ? Construits-tu des ref cursor dynamiques ? Sinon je persiste (et je signe) je ne vois pas l'intérêt des ref cursor. Rien ne t'empêche de créer plusieurs curseurs sur une même tables ou de passer en paramètres d'un curseur des valeurs.
    Les ref curseurs sont intéressants selon moi dans 2 cas principalement :
    - curseur dynamiques
    - curseurs renvoyant les mêmes colonnes en attaquant des tables différentes (cf. mon exemple)
    [/EDIT]

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 104
    Points : 64
    Points
    64
    Par défaut
    Oui désolé !!!

    Mais on ne ferme jamais les curseur??? Ca ne pose pas de problèmes???

  13. #13
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par lapartdombre
    Mais on ne ferme jamais les curseur??? Ca ne pose pas de problèmes???
    C'est un oubli de ma part, c'est corrigé

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 104
    Points : 64
    Points
    64
    Par défaut
    ET dans recherche_dispo, le curseur se ferme tout seul??? Ou pas besoin de le femer??

  15. #15
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Non il ne faut pas le fermer, car c'est juste la procédure qui ouvre le bon curseur. C'est comme si tu faisais avec des curseurs statiques :
    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
    procedure affiche_dispo (p_choix in number) is 
       curs1 cursor is select code1, libelle1 from matable1; 
       curs2 cursor is select code2, libelle2 from matable2; 
       v_lib varchar2(100); 
       v_code varchar2(30); 
     begin 
       if p_choix = 1 then
          open curs1;
       elsif p_choix = 1 then
          open curs2;
       end if;
       loop 
          fetch c_curs into v_code, v_lib; 
       exit when c_curs%notfound; 
          dbms_output.put_line (v_code || ' - ' || v_lib); 
       end loop; 
       close c_curs; 
    end;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. SQL : syntaxe insert into select
    Par chrislauxerrois dans le forum Access
    Réponses: 15
    Dernier message: 31/07/2006, 17h12
  2. [Sql] Stockage de données compressées
    Par choubiroute dans le forum Oracle
    Réponses: 5
    Dernier message: 08/03/2006, 16h46
  3. [SQL]: Requête NOT IN SELECT(...)
    Par CAPPE dans le forum Langage SQL
    Réponses: 4
    Dernier message: 23/06/2005, 15h06
  4. [VB.NET] [SQL] Retour d'un SELECT pour un IF/ELSE
    Par nys_00 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 17/03/2005, 13h50
  5. Réponses: 2
    Dernier message: 22/02/2005, 18h14

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