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 :

Executer le resultat d'une requête


Sujet :

SQL Oracle

  1. #1
    Membre actif
    Inscrit en
    Février 2008
    Messages
    457
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 457
    Points : 215
    Points
    215
    Par défaut Executer le resultat d'une requête
    Bonjour,

    Sous SQL plus, je tente de créer un script qui permettrait de faire un GRANT SELECT sur plusieurs tables du schéma d'un utilisateur à un role.

    Je vous montre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select 'grant select on SCHEMA1.'||table_name||' to MYROLE;' from all_tables where UPPER(table_name) like '%$AUD' AND UPPER(OWNER) = 'SCHEMA1';
    Comme résultat, j'obtiens ce que je désirais, à savoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    grant select on SCHEMA1.TABLE1$AUD to MYROLE;
    grant select on SCHEMA1.TABLE2$AUD to MYROLE;
    Seulement, l'instruction est inscrite mais ne s'exécute pas.
    J'ai tenté de placé un execute immédiate mais sans succès.
    Y aurait-il une fonction du type EVAL pour effectuer celà ?

    Merci d'avance.

  2. #2
    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
    Soit
    • le résultat du script 1 vous le mettez dans un fichier 2 que vous lancez ensuite via sqlplus (start fichier2)
    • soit vous employez PL/SQL et SQL Dynamique.

  3. #3
    Membre actif
    Inscrit en
    Février 2008
    Messages
    457
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 457
    Points : 215
    Points
    215
    Par défaut
    Bonjour,

    Merci de votre réponse.

    J'ai préféré la solution PL/SQL.
    J'ai généré ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    DECLARE
       CURSOR tableList IS 
    	select 'grant select on SCHEMA1.'||table_name||' to MYROLE;' as mytable 
    	from all_tables where UPPER(table_name) like '%$AUD' AND UPPER(OWNER) = 'SCHEMA1';
         sql_stmt  varchar(200);
    BEGIN
     
       FOR thisTable IN tableList LOOP
    	--DBMS_OUTPUT.PUT_LINE(thisTable.mytable);
           EXECUTE IMMEDIATE thisTable.mytable;
       END LOOP;
     
    END;
    Lorsque j'utilise DBMS OUTPUT, j'ai bien le résultat attendu.
    Si je mets Execute immediate, j'ai un joli message "caractère invalide"

  4. #4
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 76
    Points : 81
    Points
    81
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    DECLARE
       CURSOR tableList IS 
    	SELECT table_name AS mytable 
    	FROM all_tables WHERE UPPER(table_name) LIKE '%$AUD' AND UPPER(OWNER) = 'SCHEMA1';
         sql_stmt  varchar(200);
    BEGIN
     
       FOR thisTable IN tableList LOOP
    	--DBMS_OUTPUT.PUT_LINE(thisTable.mytable);
           EXECUTE IMMEDIATE ('grant select on SCHEMA1.'||thisTable.mytable  ||' to MYROLE');
       END LOOP;
     
    END;
    Voila ce que je fais.

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Essayez en retirant le point virgule après 'to MYROLE'.

  6. #6
    Membre actif
    Inscrit en
    Février 2008
    Messages
    457
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 457
    Points : 215
    Points
    215
    Par défaut
    alors j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ERREUR à la ligne 11 :
    ORA-06550: Ligne 11, colonne 4 :
    PLS-00103: Symbole "END" rencontré à la place d'un des symboles suivants :
    * & = - + ; < / > at in is mod remainder not rem return
    returning <exposant (**)> <> or != or ~= >= <= <> and or like
    LIKE2_ LIKE4_ LIKEC_ between into overlaps using || multiset
    bulk year DAY_ member SUBMULTISET_
    Symbole ";" a été substitué à "END" pour continuer.

  7. #7
    Membre actif
    Inscrit en
    Février 2008
    Messages
    457
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 457
    Points : 215
    Points
    215
    Par défaut
    Citation Envoyé par boutade80 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    DECLARE
       CURSOR tableList IS 
    	SELECT table_name AS mytable 
    	FROM all_tables WHERE UPPER(table_name) LIKE '%$AUD' AND UPPER(OWNER) = 'SCHEMA1';
         sql_stmt  varchar(200);
    BEGIN
     
       FOR thisTable IN tableList LOOP
    	--DBMS_OUTPUT.PUT_LINE(thisTable.mytable);
           EXECUTE IMMEDIATE ('grant select on SCHEMA1.'||thisTable.mytable  ||' to MYROLE');
       END LOOP;
     
    END;
    Voila ce que je fais.
    Même résultat !

  8. #8
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 76
    Points : 81
    Points
    81
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    DECLARE
       CURSOR tableList IS 
    	SELECT table_name AS mytable 
    	FROM all_tables WHERE UPPER(table_name) LIKE '%$AUD' AND UPPER(OWNER) = 'SCHEMA1';
         sql_stmt  varchar(200);
    BEGIN
     
       FOR thisTable IN tableList LOOP
    	--DBMS_OUTPUT.PUT_LINE(thisTable.mytable);
           EXECUTE IMMEDIATE ('grant select on SCHEMA1.'||thisTable.mytable  ||' to MYROLE');
       END LOOP;
     
    END;
    /
    Avec le / a la fin si c'est executé sous sqlplus.
    Mais ca n'explique pas l'erreur ligne 11

  9. #9
    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
    Avec la modification proposé par Waldar ça marche
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    Connected to Oracle Database 10g Express Edition Release 10.2.0.1.0 
    Connected as mni
     
    SQL> 
    SQL> drop role myrole
      2  /
     
    Role dropped
    SQL> create role myrole
      2  /
     
    Role created
    SQL> set serveroutput on
    SQL> DECLARE
      2     CURSOR tableList IS
      3    SELECT 'grant select on mni.'||table_name||' to MYROLE' AS mytable
      4    FROM all_tables WHERE UPPER(table_name) LIKE '%' AND UPPER(OWNER) = 'MNI';
      5       sql_stmt  varchar(200);
      6  BEGIN
      7  
      8     FOR thisTable IN tableList LOOP
      9         dbms_output.put_line(thisTable.mytable);
     10         EXECUTE IMMEDIATE thisTable.mytable;
     11     END LOOP;
     12  
     13  END;
     14  /
     
    grant select on mni.USERS to MYROLE
    grant select on mni.T_T2 to MYROLE
    grant select on mni.T_T1 to MYROLE
    grant select on mni.TEST_117 to MYROLE
    grant select on mni.TEST_110 to MYROLE
    grant select on mni.TEST_109 to MYROLE
    grant select on mni.TASK_USER to MYROLE
    grant select on mni.TASK to MYROLE
    grant select on mni.SALGRADE to MYROLE
    grant select on mni.REPORT_DEADLOCK to MYROLE
    grant select on mni.PRODUIT to MYROLE
    grant select on mni.PRODCDE to MYROLE
    grant select on mni.PERSONNE to MYROLE
    grant select on mni.EMP1 to MYROLE
    grant select on mni.EMP to MYROLE
    grant select on mni.ECR to MYROLE
    grant select on mni.DUMMY to MYROLE
    grant select on mni.DEPT to MYROLE
    grant select on mni.COMMANDE to MYROLE
    grant select on mni.BONUS to MYROLE
    grant select on mni.ACCT to MYROLE
     
    PL/SQL procedure successfully completed
     
    SQL>

  10. #10
    Membre actif
    Inscrit en
    Février 2008
    Messages
    457
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 457
    Points : 215
    Points
    215
    Par défaut
    Ohhh effectivement... Waldar avait raison.
    Disons que j'ai mal interpreté et que j'ai retiré le mauvais ";"

    Un grand merci à vous !

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

Discussions similaires

  1. Impossible d'exporter le resultat d'une requête
    Par uloaccess dans le forum Access
    Réponses: 5
    Dernier message: 21/02/2008, 19h20
  2. affichage du resultat d'une requête
    Par PAUL87 dans le forum Access
    Réponses: 3
    Dernier message: 25/09/2005, 20h12
  3. Resultat d'une requête dans TEdit
    Par the watcher dans le forum Connexion aux bases de données
    Réponses: 5
    Dernier message: 08/09/2005, 18h00
  4. [SQL Server] Limiter le resultat d'une requête
    Par obiwan dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 02/06/2004, 11h25
  5. Proposer le resultat d'une requête en téléchargement
    Par Lux interior dans le forum XMLRAD
    Réponses: 5
    Dernier message: 17/02/2003, 15h44

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