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 :

Créer un curseur sous condition


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 48
    Points : 33
    Points
    33
    Par défaut Créer un curseur sous condition
    Bonjour,
    J'ai un traitement PL/SQL que je dois reprendre, malheureusement je ne m'y connais pas forcement.
    Le traitement se fait sur le résultat d'un curseur CI.

    Ce qu'il faut que je fasse c'est d'inclure dans le traitement certaines données en fonction d'un résultat sur un select. J'aimerais donc lier la déclaration de mon curseur au résultat d'une condition.

    Ce qui donnerait un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    If (select count(*) from Matable <>0) then
        Cursor ci select ....
    Else
        Cursor ci Autre select...
     
    End if;
    Malheureusement je m'embrouille dans le placement de ces déclarations, dans le declare, dans le begin etc...

    De plus je ne suis pas sur que l'on puisse mettre comme condition du if le résultat d'une requête.


    Si quelqu'un peut m'éclairer sur la faisabilité de la chose et sur la façon de procéder ce serait super.

    Merci d'avance

  2. #2
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 263
    Points
    263
    Par défaut
    Bonjour,

    http://download.oracle.com/docs/cd/B..._statement.htm


    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
     
    DECLARE
      TYPE cursor_ref IS REF CURSOR;
      c1 cursor_ref;
      TYPE cur_tab IS TABLE OF varchar2(50);
      rec_tab cur_tab; 
     
      lv_query VARCHAR2(4000);
      lv_count NUMBER;
    BEGIN
        SELECT 0 
        INTO lv_count
        FROM dual 
        ;
     
    IF (lv_count > 0 ) then
        lv_query := ' ';
        lv_query := lv_query || ' SELECT ''TOTO'' ';
        lv_query := lv_query || ' FROM DUAL  ';
    Else
        lv_query := ' ';
        lv_query := lv_query || ' SELECT ''TATA'' ';
        lv_query := lv_query || ' FROM DUAL ';
    End IF;
     
      OPEN c1 FOR lv_query ;
      FETCH c1 BULK COLLECT INTO rec_tab; 
      FOR i in rec_tab.first..rec_tab.last
      loop
          dbms_output.put_line(rec_tab(i));
      end loop;
     
    END;
    /

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 48
    Points : 33
    Points
    33
    Par défaut
    Merci pour ta réponse,
    J'ai effectivement trouvé des choses sur les curseurs dynamiques.
    J'ai essayé de faire quelquechose comme ca et ca a l'air de marcher.

    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
    CREATE OR REPLACE PROCEDURE IDXIMM.Exec IS
    immtyp varchar(3);
        cursor ci (immtyp varchar) is select * from Ma_TABLE and doctypimm <> immtyp;
     
        BEGIN
     
            immtyp :='STE';
     
             for cirec in ci(immtyp) loop
                INSERT into W_EUREKA_TEST ...
              end loop;
     
     
     
     
    END Exec;
    /
    Quelle est la différence avec ta solution ? En existe il une meilleur que l'autre ?

  4. #4
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Points : 1 359
    Points
    1 359
    Par défaut
    Bonjour,

    Généralement lorsque dans votre code PL/SQL il y a des instructions qui s'executent sur la base d'un select count, c'est qu'il y a forcément des choses à revoir. Le select count est généralement inutile dans ce cas

    Sinon pour répondre à votre problème

    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
     
    DECLARE
     cursor c1 is
     select * from emp;
     
     cursor c2 is
     select * from dept;
     
    BEGIN
     
      if count(1) = 0 then
        open cursor c1;
      etc...
     else
       open cursor c2;
      etc...
     end if;
     
     ....
    Bien à vous

    Mohamed Houri

  5. #5
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 263
    Points
    263
    Par défaut
    Bonjour,

    Avec cette syntaxe tu peux binder ton curseur.

    De plus le BULK permet de limiter les switchs entre le moteur SQL et PL/SQL.

    http://download.oracle.com/docs/cd/B...61/dynamic.htm
    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
     
    DECLARE 
     
       TYPE cursor_ref IS REF CURSOR;
       c1 cursor_ref;
       TYPE cur_tab IS TABLE OF varchar2(50);
       rec_tab cur_tab; 
     
        lv_query VARCHAR2(4000);
        immtyp :='STE';
     
    BEGIN
     
        lv_query := ' ';
        lv_query := lv_query || ' SELECT * FROM Ma_TABLE ';
        lv_query := lv_query || ' WHERE doctypimm <> :1';
     
     
       OPEN c1 FOR lv_query USING immtyp ;
     
       FETCH c1 BULK COLLECT INTO rec_tab; 
       FOR i IN rec_tab.first..rec_tab.last
       loop
           dbms_output.put_line(rec_tab(i));
       end loop;
     
    END;
    /
    On obtient de meilleurs performance avec cette syntaxe, évidemment si tu ne dois traiter que 3 lignes ....

    cordialement.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 48
    Points : 33
    Points
    33
    Par défaut
    Merci pour vos réponses,
    @ Mohamed, j'avais pensé a une solution de ce style,
    le probleme étant la maintenabilité.
    En effet si le process est modifié, il faut appliquer la modif a chaque if, pas forcément l'idéal.

    Je passe en résolu

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

Discussions similaires

  1. Créer un format sous condition
    Par discus23 dans le forum Macro
    Réponses: 1
    Dernier message: 25/08/2015, 22h13
  2. Créer un bouton sous une condition
    Par cecilouchou dans le forum Langage
    Réponses: 9
    Dernier message: 26/04/2013, 16h18
  3. Créer une liste déroulante sous conditions
    Par Sylcoco dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 09/07/2011, 17h11
  4. Créer une moyenne sous condition
    Par david1409 dans le forum Excel
    Réponses: 8
    Dernier message: 28/07/2009, 07h56
  5. Réponses: 2
    Dernier message: 04/02/2007, 09h55

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