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 :

Boucle WHILE sous oracle


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 6
    Par défaut Boucle WHILE sous oracle
    Bonjour,

    je fait une maquette avec oracle 10g et mon objectif est de créer des comptes utilisateurs automatiquement, à partir de la table "conducteur" de ma BDD, en utilisant une boucle WHILE

    Le nom du compte correspondra au "nom_conducteur", et le mot de passe au "prenom_conducteur".
    En utilisant les divers tuto j'en suis arrivé au résultat suivant :

    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
    DECLARE /*je declare les variables dont j'ai besoin*/
    	var1 varchar(50),
    	var2 varchar (50),
    	login varchar (12),
    	pwd varchar (12);
    
    DECLARE /*je declare mon curseur qui contient le résultat de la requette suivante*/
    curseur CURSOR for
    	SELECT nom_conducteur, penom_conducteur
    	FROM conducteur
    	ORDER BY nom_conducteur;
    
    BEGIN
    	OPEN curseur;
    	FETCH curseur INTO @login, @pwd;/*je remplis les variables qui vont contenir nom_conducteur dans login et prenom_conducteur dans pwd*/
    
    	WHILE @@FETCH_STATUS=0
    	/*la varible 1 va contenir la synthaxe de création de compte*/
    		@var1:='create user' ||login||;
    		@var1:=@var1||'identified by' ||pwd;
    		execute immediate @var1;
    	/*la variable 2 va contenir la synthaxe d'attribution des droits aux comptes*/	
    		@var2:='grant connect to' ||login;
    		execute immediate @var2;
    		
    	CLOSE curseur;
    DEALLOCATE curseur;
    END;
    Néanmoins deux problème se posent :
    -le premier : comme je débute en SQL, je ne sais pas comme utiliser ce code dans ma BDD
    -le second : je ne suis pas sûre de la syntaxe de mon code et je ne peux la vérifier parce que je ne sais pas comme on l'utilise dans une BDD

    Voila si qlqun peut me dépanner ça serait sympa

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 331
    Par défaut
    Tu y étais presque
    Ton code doit 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 /*je declare les variables dont j'ai besoin*/
    	var1 varchar(50);
    	var2 varchar (50);
    	login varchar (12);
    	pwd varchar (12);
     
    CURSOR curseur IS
    	SELECT nom_conducteur, prenom_conducteur
    	FROM conducteur
    	ORDER BY nom_conducteur;
     
    BEGIN
    	OPEN curseur;
    	loop
    		FETCH curseur INTO login, pwd;
    		EXIT WHEN curseur%NOTFOUND;
    		dbms_output.put_line('create user ' || login || ' identified by ' || pwd || ';');
    		dbms_output.put_line('grant connect to ' || login || ';');
    	end loop;	
    	CLOSE curseur;
    END;
    Je te laisse le modifier en remplaçant les lignes commençant par : dbms_output ....

    Bon courage

    Rachid

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Une autre façon de l'écrire, avec le WHILE.
    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
    DECLARE                            /*je declare les variables dont j'ai besoin*/
       var1    VARCHAR (50);
       var2    VARCHAR (50);
       login   VARCHAR (12);
       pwd     VARCHAR (12);
     
       CURSOR curseur
       IS
          SELECT   nom_conducteur, prenom_conducteur
              FROM conducteur
          ORDER BY nom_conducteur;
    BEGIN
       OPEN curseur;
     
       FETCH curseur
        INTO login, pwd;
     
       WHILE curseur%FOUND
       LOOP
          /*la varible 1 va contenir la synthaxe de création de compte*/
          var1 := 'create user' || login || 'identified by' || pwd;
     
          EXECUTE IMMEDIATE var1;
     
          /*la variable 2 va contenir la synthaxe d'attribution des droits aux comptes*/
          var2 := 'grant connect to' || login;
     
          EXECUTE IMMEDIATE var2;
       END LOOP;
     
       CLOSE curseur;
    END;
    NB: les variables s'utilisent avec leur nom déclaré, pas de '@' devant.

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    ou tout simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    BEGIN
        FOR conducteur IN (SELECT   nom_conducteur nom, prenom_conducteur prenom
              FROM conducteur
          ORDER BY nom_conducteur)
        LOOP
          EXECUTE IMMEDIATE 'create user ' || conducteur.nom || ' identified by ' || conducteur.prenom;
     
           EXECUTE IMMEDIATE 'grant connect to ' || conducteur.nom;
     
     
       END LOOP;
     
    END;
    Attention à penser aux espaces dans les chaines de caractères

  5. #5
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    Citation Envoyé par GoLDoZ Voir le message
    Une autre façon de l'écrire, avec le WHILE.
    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
    DECLARE                            /*je declare les variables dont j'ai besoin*/
       var1    VARCHAR (50);
       var2    VARCHAR (50);
       login   VARCHAR (12);
       pwd     VARCHAR (12);
     
       CURSOR curseur
       IS
          SELECT   nom_conducteur, prenom_conducteur
              FROM conducteur
          ORDER BY nom_conducteur;
    BEGIN
       OPEN curseur;
     
       FETCH curseur
        INTO login, pwd;
     
       WHILE curseur%FOUND
       LOOP
          /*la varible 1 va contenir la synthaxe de création de compte*/
          var1 := 'create user' || login || 'identified by' || pwd;
     
          EXECUTE IMMEDIATE var1;
     
          /*la variable 2 va contenir la synthaxe d'attribution des droits aux comptes*/
          var2 := 'grant connect to' || login;
     
          EXECUTE IMMEDIATE var2;
       END LOOP;
     
       CLOSE curseur;
    END;
    NB: les variables s'utilisent avec leur nom déclaré, pas de '@' devant.
    Je pense que ça fait une boucle infinie.
    Il ne manquerait pas un FETCH à l'intérieur de la boucle, juste avant le END LOOP ?

  6. #6
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 6
    Par défaut
    Un grand merci à tous pour vos explications.
    J'ai encore quelques comptes qui ne se crées pas mais je pense pouvoir régler la chose tout seul en utilisant ce que vous m'avez dis.

    Citation Envoyé par xdescamp Voir le message
    Je pense que ça fait une boucle infinie.
    Il ne manquerait pas un FETCH à l'intérieur de la boucle, juste avant le END LOOP ?
    J'ai aussi l'impression que ça fait une boucle infinie.
    Quand je le lance il me créer le premier utilisateur, puis une erreur se produit : cet utilisateur est en conflit avec un autre utilisateur ou rôle.
    Je pense donc que le programme créer à chaque fois le premier utilisateur.

    Si tu sait ce qu'il faut rajouter à l'intérieur de la boucle pour éviter que ça fasse une boucle infinie je suis preneur

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Citation Envoyé par xdescamp Voir le message
    Je pense que ça fait une boucle infinie.
    Il ne manquerait pas un FETCH à l'intérieur de la boucle, juste avant le END LOOP ?
    Si! Toutes mes confuses...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       WHILE curseur%FOUND
       LOOP
          .......
          EXECUTE IMMEDIATE var2;
          FETCH curseur INTO login, pwd;
       END LOOP;
    Je n'utilise que rarement cette façon d'écrire, justement parce que je trouve le code trop lourd.

    Citation Envoyé par GreenCard Voir le message
    Si tu sait ce qu'il faut rajouter à l'intérieur de la boucle pour éviter que ça fasse une boucle infinie je suis preneur
    "FETCH curseur INTO login, pwd;" avant le "END LOOP".

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    FOR c'est la vie

  9. #9
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 6
    Par défaut
    Citation Envoyé par GoLDoZ Voir le message
    "FETCH curseur INTO login, pwd;" avant le "END LOOP".
    Merci

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

Discussions similaires

  1. boucle "while" dans un sous-formulaire
    Par philebaucis dans le forum VBA Access
    Réponses: 4
    Dernier message: 02/04/2017, 06h15
  2. Pb boucle while (débutant sous python)
    Par rocketter dans le forum Général Python
    Réponses: 4
    Dernier message: 11/03/2014, 08h34
  3. Pas de JOIN sous Oracle (vraiment dommage...)
    Par Isildur dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/03/2007, 11h28
  4. Cryptage de colonnes sous Oracle
    Par Julian Roblin dans le forum SQL
    Réponses: 9
    Dernier message: 28/11/2006, 18h24
  5. [débutant]Documentation? boucle "while"? Session?
    Par o151181 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 19/01/2004, 15h20

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