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 :

[PL/SQL] connect en SQL dynamique


Sujet :

SQL Oracle

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut [PL/SQL] connect en SQL dynamique
    Bonjour,
    je souhaite créer n utilisateurs avec pour chacun la même base.
    Je procède comme suit:
    Je créé un utilisateur user_i, je me connecte avec ses ids et je lance un script pour la base.

    Voici ma boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    for i in 1..n loop
     dbms_output.put_line('CREATION DE L''UTILISATEUR '||i);
     execute immediate 'conn system/manager';
     execute immediate 'DROP USER user'||i' CASCADE';
     execute immediate 'CREATE USER user'||i' IDENTIFIED BY pass'||i;
     execute immediate 'GRANT CONNECT, DBA, RESOURCE TO user'||i;
     execute immediate 'conn user'||i||'/pass'||i;
     execute immediate 'start /opt/oracle/scripts/db.sql';
    end loop;
    J'ai l'erreur suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    declare
    *
    ERROR at line 1:
    ORA-00900: invalid SQL statement
    ORA-06512: at line 23
    à priori l'erreur vient du execute immediate 'connect system/manager'
    Quelqu'un pourrait me dire comment contourner cela ?

    J'ai trouvé ceci sur le web mais ça ne m'a pas trop convaincu :
    http://www.thescripts.com/forum/thread65749.html

    Merci d'avance.

  2. #2
    Membre expérimenté Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Points : 1 734
    Points
    1 734
    Par défaut
    Ca me paraitrait surprenant si on pouvait changer de user dans un même bloc PL/SQL
    Tu peux éventuellement enregistrer ton script dans un fichier temporaire (avec spool ou utl_file) et l'exécuter ensuite via un sqlplus
    La théorie, c'est quand on sait tout mais que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

    Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2007
    Messages : 149
    Points : 167
    Points
    167
    Par défaut
    Tu peux mettre la totalité du code ?

    J'ai l'impression qu'il plante simplement sur le mot clé declare qui ne doit pas etre au bon endroit.
    Mon site : TKT-Web =)

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour,
    merci pour la réponse.
    Effectivement, c'est ce que j'avais fait en attendant de trouver une solution...
    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
    spool script.sql
    declare
    ...
    begin
    ...
    FOR i IN 1..n loop
     dbms_output.put_line('CREATION DE L''UTILISATEUR '||i);
     dbms_output.put_line ('conn system/manager');
     dbms_output.put_line ('DROP USER user'||i' CASCADE');
     dbms_output.put_line ('CREATE USER user'||i' IDENTIFIED BY pass'||i);
     dbms_output.put_line ('GRANT CONNECT, DBA, RESOURCE TO user'||i);
     dbms_output.put_line ('conn user'||i||'/pass'||i);
     dbms_output.put_line ('start /opt/oracle/scripts/db.sql');
    end loop;
    ...
    end;
    /
    spool off;
    ----------
    start script.sql
    Mais j'aimerai pouvoir le faire directement à partir de PL/SQL...
    Tout ceci s'inscrit dans un module et gérer des bouts de fichiers (i.e. scripts) va me compliquer encore la tâche.

    Thanks ...

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Delwyn Voir le message
    Tu peux mettre la totalité du code ?
    J'ai l'impression qu'il plante simplement sur le mot clé declare qui ne doit pas etre au bon endroit.
    Cela m'étonnerait, j'ai déjà vérifié cette piste : J'ai viré les lignes de connexion avec execute immediate et tout marche normalement !

    J'ai aussi testé ce code et il renvoi la même erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    connect system/manager;
    drop user user1 cascade;
    create user user1 identified by id1;
    grant dba, connect, resource to user1;
    declare
    begin
    execute immediate 'connect user1/id1';
    end;
    /
    ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    declare
    *
    ERROR at line 1:
    ORA-00900: invalid SQL statement
    ORA-06512: at line 3
    Merci quand même.
    ...

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2007
    Messages : 149
    Points : 167
    Points
    167
    Par défaut
    Citation Envoyé par mbgh1302 Voir le message
    Bonjour,
    merci pour la réponse.
    Effectivement, c'est ce que j'avais fait en attendant de trouver une solution...
    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
    spool script.sql
    declare
    ...
    begin
    ...
    FOR i IN 1..n loop
     dbms_output.put_line('CREATION DE L''UTILISATEUR '||i);
     dbms_output.put_line ('conn system/manager');
     dbms_output.put_line ('DROP USER user'||i' CASCADE');
     dbms_output.put_line ('CREATE USER user'||i' IDENTIFIED BY pass'||i);
     dbms_output.put_line ('GRANT CONNECT, DBA, RESOURCE TO user'||i);
     dbms_output.put_line ('conn user'||i||'/pass'||i);
     dbms_output.put_line ('start /opt/oracle/scripts/db.sql');
    end loop;
    ...
    end;
    /
    spool off;
    ----------
    start script.sql
    Mais j'aimerai pouvoir le faire directement à partir de PL/SQL...
    Tout ceci s'inscrit dans un module et gérer des bouts de fichiers (i.e. scripts) va me compliquer encore la tâche.

    Thanks ...
    Bonjour,

    Il semblerait que tu ais oublié des pipes || après i sur les lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     dbms_output.put_line ('DROP USER user'||i' CASCADE');
     dbms_output.put_line ('CREATE USER user'||i' IDENTIFIED BY pass'||i);

    Par contre tu risques de pulveriser le buffer, y'a un thread plus bas qui donne une approche (utl_file).

    Le code qui fonctionne chez 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    SET serveroutput on;
     
    DECLARE
       I   NUMBER;
       N   NUMBER;
    BEGIN
       N := 10;
     
       FOR I IN 1 .. N
       LOOP
          DBMS_OUTPUT.PUT_LINE ('CREATION DE L''UTILISATEUR ' || I);
          DBMS_OUTPUT.PUT_LINE ('CREATION DE L''UTILISATEUR ' || I);
          DBMS_OUTPUT.PUT_LINE ('conn system/manager');
          DBMS_OUTPUT.PUT_LINE ('DROP USER user' || I || ' CASCADE');
          DBMS_OUTPUT.PUT_LINE ('CREATE USER user' || I || ' IDENTIFIED BY pass'
                                || I
                               );
          DBMS_OUTPUT.PUT_LINE ('GRANT CONNECT, DBA, RESOURCE TO user' || I);
          DBMS_OUTPUT.PUT_LINE ('conn user' || I || '/pass' || I);
          DBMS_OUTPUT.PUT_LINE ('start /opt/oracle/scripts/db.sql');
       END LOOP;
    END;
    /
    Mon site : TKT-Web =)

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Delwyn Voir le message
    Bonjour,
    Il semblerait que tu ais oublié des pipes || après i sur les lignes :
    Bonjour, oui c'est vrai j'ai oublié les pipes dans le post
    mais dans le script elles y sont.
    Le script fonctionne chez moi aussi.

  8. #8
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Pourriez-vous aller chercher dans SQL Reference la syntaxe de l'instruction connect ? Est-ce que vous l'avez trouvé ?

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2007
    Messages : 149
    Points : 167
    Points
    167
    Par défaut
    J'avais pas tout lu navré =)

    On disais que je cherchais pas vraiment au bonne endroit.

    Ceci-dit le fait d'avoir le mot clé declare sans déclarer de variable me choque un peu. Et peut-être oracle aussi.

    Pour exemple si l'on utilise une structure de test if sans instruction oracle nous jette :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    IF L_VAR = 0 THEN
    END IF;
    Ca ne compile pas ! Non mon bout de code n'est pas stupide ! Essaye de virer le mot clé declare pour voir, sait-on jamais.
    Mon site : TKT-Web =)

  10. #10
    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
    vous croyez pas qu'un connect en plein milieu d'une session PL/SQL ça va poser un problème ? Sachant en plus que conn est une commande SQL*Plus et pas SQL

    ce code ne pourra évidemment jamais fonctionner

Discussions similaires

  1. Se connecter à Sql Server ou Oracle dynamiquement
    Par dachir dans le forum Accès aux données
    Réponses: 11
    Dernier message: 19/10/2007, 11h23
  2. [SQL] Recupération Requete SQL dans un tableau dynamique PHP
    Par victor.jbju dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 13/09/2006, 16h48
  3. [SQL] Structure de table dynamique
    Par litbos dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 02/09/2005, 15h49
  4. Réponses: 7
    Dernier message: 18/07/2005, 13h42
  5. Réponses: 4
    Dernier message: 30/01/2005, 14h23

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