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

SQL Oracle Discussion :

Équivalent de l'instruction "Continue"


Sujet :

SQL Oracle

  1. #1
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut Équivalent de l'instruction "Continue"
    Je suis dans une boucle du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for Cur in (select * from HIST_CONTENANT) loop
    ...
    end loop;
    Et à l'intérieur de ma boucle, selon le résultat d'une condition if, je souhaiterais passer à l'itération suivante, sans continuer d'exécuter le reste du code contenu dans cette boucle loop.
    En gros, l'équivalent de l'instruction continue en Delphi ou C++.

    Y a t'il une instruction équivalente en PL/SQL Oracle ?

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    il faut faire un bloc BEGIN/END avec une EXCEPTION.

  3. #3
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    continue existe en oracle
    http://download.oracle.com/docs/cd/B...s.htm#CJAHCFBF

    bon, dans une version plus ancienne, il faut feinter avec des blocs et des exit

  4. #4
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut
    Citation Envoyé par laurentschneider Voir le message
    Arf. Pas de chance, je suis en 10g et non en 11g.
    Quand j'essai, il ne connait pas l'instruction.

    Citation Envoyé par laurentschneider Voir le message
    bon, dans une version plus ancienne, il faut feinter avec des blocs et des exit
    Citation Envoyé par orafrance Voir le message
    il faut faire un bloc BEGIN/END avec une EXCEPTION.
    Je ne vois pas comment faire. Tu n'aurrais pas un petit exemple ?
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  5. #5
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    exit;
    ....
    exit when .....;
    ....
    You use the EXIT statement to exit a loop. The EXIT statement has two forms: the unconditional EXIT and the conditional EXIT WHEN. With either form, you can name the loop to be exited.

    Usage Notes
    The EXIT statement can be used only inside a loop. PL/SQL lets you code an infinite loop. For example, the following loop will never terminate normally:

    WHILE TRUE LOOP ... END LOOP;
    In such cases, you must use an EXIT statement to exit the loop.

    If you use an EXIT statement to exit a cursor FOR loop prematurely, the cursor is closed automatically. The cursor is also closed automatically if an exception is raised inside the loop.
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

    Oracle 12C R2 - Forms11GR2 - Toad 12 - sharePoint 2010

  6. #6
    Membre averti Avatar de LBO72
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 342
    Points
    342
    Par défaut
    C'est bon à savoir

  7. #7
    Membre habitué Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 196
    Points
    196
    Par défaut
    C'est pas garantie 100% bug free, mais cela devrait ressembler à quelque chose du genre :

    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
    declare 
      i integer;
      MyContinue EXCEPTION;
    begin
    for Cur in (select * from HIST_CONTENANT) LOOP
    	BEGIN
    		 IF conditionTrue THEN
    	   	 	RAISE MyContinue;
    		 END IF;
    		 -- Process continues here
    		 -- ...
    		 -- ...
    	EXCEPTION
    		WHEN MyContinue THEN
    			 -- Anything that could be done before processing next iteration
    			 NULL;
    		WHEN OTHERS THEN
    			 RAISE;
    	END;	
    end loop;
     
    end;
    En clair, lorsque tu ne veux pas continuer le traitement, tu fais un RAISE exception qui te permet d'aller directement au niveau du bloc EXCEPTION et ainsi ne pas exécuter le code au milieu sans passer par un IF..ENDIF interminable, ni par un GOTO

  8. #8
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut Dans la série "Je reinvente la roue"....
    Citation Envoyé par Loyd1974 Voir le message
    C'est pas garantie 100% bug free, mais cela devrait ressembler à quelque chose du genre :

    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
    declare 
      i integer;
      MyContinue EXCEPTION;
    begin
    for Cur in (select * from HIST_CONTENANT) LOOP
        BEGIN
             IF conditionTrue THEN
                    RAISE MyContinue;
             END IF;
             -- Process continues here
             -- ...
             -- ...
        EXCEPTION
            WHEN MyContinue THEN
                 -- Anything that could be done before processing next iteration
                 NULL;
            WHEN OTHERS THEN
                 RAISE;
        END;    
    end loop;
     
    end;
    En clair, lorsque tu ne veux pas continuer le traitement, tu fais un RAISE exception qui te permet d'aller directement au niveau du bloc EXCEPTION et ainsi ne pas exécuter le code au milieu sans passer par un IF..ENDIF interminable, ni par un GOTO
    OU " Comment reinventer le EXIT " !!!!
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

    Oracle 12C R2 - Forms11GR2 - Toad 12 - sharePoint 2010

  9. #9
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut
    Citation Envoyé par Garuda Voir le message
    You use the EXIT statement to exit a loop.
    Mais, le exit quitte définitivement la boucle, alors que moi je veux juste passer à l'itération suivante.
    Ou alors, j'ai pas compris ...

    Citation Envoyé par Loyd1974 Voir le message
    C'est pas garantie 100% bug free, mais cela devrait ressembler à quelque chose du genre :

    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
    declare 
      i integer;
      MyContinue EXCEPTION;
    begin
    for Cur in (select * from HIST_CONTENANT) LOOP
    	BEGIN
    		 IF conditionTrue THEN
    	   	 	RAISE MyContinue;
    		 END IF;
    		 -- Process continues here
    		 -- ...
    		 -- ...
    	EXCEPTION
    		WHEN MyContinue THEN
    			 -- Anything that could be done before processing next iteration
    			 NULL;
    		WHEN OTHERS THEN
    			 RAISE;
    	END;	
    end loop;
     
    end;
    En clair, lorsque tu ne veux pas continuer le traitement, tu fais un RAISE exception qui te permet d'aller directement au niveau du bloc EXCEPTION et ainsi ne pas exécuter le code au milieu sans passer par un IF..ENDIF interminable, ni par un GOTO
    Pas bête le coup du exception.
    Je teste ...

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  10. #10
    Membre habitué Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 196
    Points
    196
    Par défaut
    Citation Envoyé par Garuda Voir le message
    OU " Comment reinventer le EXIT " !!!!
    Sauf si je me trompe lourdement, mais il me semble que le EXIT fait sortir de la boucle, et Lung veut passer à l'itération suivante et non pas sortir.

    Alors, je dirais plutôt que j'ai réinventer le CONTINUE, en attendant la 11g

  11. #11
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Mais, le exit quitte définitivement la boucle, alors que moi je veux juste passer à l'itération suivante.

    Je dois être un peu idiot !!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    begin
    for Cur in (select * from HIST_CONTENANT) LOOP
        ...
             IF NOT(conditionTrue) THEN
             ....       
             END IF;    
    end loop;
    
    end;
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

    Oracle 12C R2 - Forms11GR2 - Toad 12 - sharePoint 2010

  12. #12
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    avec goto

    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
    begin
      for i in 1..7 loop
        if i=5 then
          goto CONT; -- continue
        end if;
        dbms_output.put_line(i);
        <<CONT>> null;
      end loop;
    end;
    /
    1
    2
    3
    4
    6
    7

  13. #13
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Citation Envoyé par laurentschneider Voir le message
    avec goto

    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
    begin
      for i in 1..7 loop
        if i=5 then
          goto CONT; -- continue
        end if;
        dbms_output.put_line(i);
        <<CONT>> null;
      end loop;
    end;
    /
    1
    2
    3
    4
    6
    7
    Alors déja que le "exit" c'est pas propre, alors je te dis pas le "GOTO".
    remarque personnelle : si vous avez besoin d'utiliser ce genre d'artifice (exit, continue et autres goto), c'est surement qu'il faut prendre le problème autrement et restructurer votre code !
    mais ceci n'engage que moi !

    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
     
    begin
      for i in 1..7 loop
        if i<>5 then
          dbms_output.put_line(i);
        end if;
      end loop;
    end;
    /
    1
    2
    3
    4
    6
    7
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

    Oracle 12C R2 - Forms11GR2 - Toad 12 - sharePoint 2010

  14. #14
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par Garuda Voir le message
    Alors déja que le "exit" c'est pas propre, alors je te dis pas le "GOTO".
    Garuda part en croisade contre le Goto

    Sérieusement, mon GOTO fait exactement la même chose qu'un CONTINUE, et vu que CONTINUE est apparu est 11g...

  15. #15
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Garuda part en croisade contre le Goto
    Oui (c'est mon coté didactique) et j'ai plein d'autres combats stériles en magasin : PHP, les 4x4,etc...
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

    Oracle 12C R2 - Forms11GR2 - Toad 12 - sharePoint 2010

  16. #16
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut
    Citation Envoyé par Garuda Voir le message
    remarque personnelle : si vous avez besoin d'utiliser ce genre d'artifice (exit, continue et autres goto), c'est surement qu'il faut prendre le problème autrement et restructurer votre code !
    mais ceci n'engage que moi !
    Bin, j'utilise couramment Continue en Delphi pour la même raison.
    C'est pour éviter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if ... then
       if ... then
          if ... then
             if ... then
                if ... then
                   if ... then
                      if ... then
                         if ... then
                            if ... then
                               if ... then
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  17. #17
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut
    Ta solution fonctionne, Loyd1974.

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  18. #18
    Membre habitué Avatar de Currahee
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 157
    Points : 130
    Points
    130
    Par défaut
    Citation Envoyé par Garuda Voir le message
    Oui (c'est mon coté didactique) et j'ai plein d'autres combats stériles en magasin : PHP, les 4x4,etc...
    Hop en passant j'attrape la remarque au vol :

    Pourquoi Garuda vouloir te battre contre le PHP ? (Je demande ça car j'aimerai m'y mettre).
    "Ne soyez rien, devenez sans cesse"

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

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