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 :

Exécution SQL dynamique


Sujet :

PL/SQL Oracle

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2016
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Exécution SQL dynamique
    Bonjour a tous,

    Dans un projet professionnel, je veux donner en tant que paramètre à une procédure stockée Oracle, une liste d'instructions SQL contenant SELECT pour les exécuter et obtenir les résultats.

    Exemple de paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    declare csSelect varchar(4000);
     begin
     csSelect := 'SELECT * FROM JOURNAL';
     if 'A' != '%' then
        csSelect := csSelect || 'WHERE JOURNAL.NOM LIKE ''A%'' ';
     end if;
    Je besoin de ce pour Oracle et SQL Server. J'ai trouvé pour le serveur sql mais pas pour Oracle.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 804
    Points
    30 804
    Par défaut
    C'est sans doute la commande EXECUTE IMMEDIATE que tu cherches...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2016
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Alors j'ai bien essayé d'utilisé mais je n'arrive pas a retourner les résultats du select

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Sans indice supplémentaire, voici le tuto de EXECUTE IMMEDIATE.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  5. #5
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2016
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    j'ai bien compris l'utilisation execute immediate, cela dis, je n'ai pas les données sélectionnées pour autant

  6. #6
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2016
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Pour être plus précis, mon application web est capable d'appeler une proc ou fonction ou tout autre chose de la base de données avec des paramètres.
    Je souhaite donc écrire une proc ou fonction ou autre chose qui me permettra de passer un paramètre qui contient de code sql comme celui ci
    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
     
    string sql = "declare csSelectCosmos varchar(4000); "
    + " begin "
    + " csSelectCosmos:= '"
    + " SELECT USR.NOM AS USR,  JOURNAL.DT_MODIFICATION,  JOURNAL.MODIFICATION, PERSONNEL.NOM, PERSONNEL.PRENOM, JOURNAL.TYPE "
    + " FROM "
    + " JOURNAL INNER JOIN "
    + " PERSONNEL ON JOURNAL.NO_PERSONNEL = PERSONNEL.NO_PERSONNEL INNER JOIN "
    + " USR ON JOURNAL.NO_USR = USR.NO_USR "
    + " '; "
    + "  "
    + " IF '%' != '%' then "
    + " csSelectCosmos := csSelectCosmos || ' WHERE JOURNAL.TYPE LIKE ''P%'' '; "
    + " end if; "
    + "  "
    + " csSelectCosmos:= csSelectCosmos || ' ORDER BY JOURNAL.DT_MODIFICATION DESC'; "
    + "  "
    + " execute immediate csSelectCosmos; "
    + " end; ";
    et donc de me retourner les données.
    A savoir que le contenu de la requête est complétement dynamique, nombre de champs, liaison entre les tables

    Sous sqlserver un simple execute m'a donné le résultat assez facilement mais sous oracle, je ne suis vraiment pas a l'aise et évidemment si je n'avais pas déjà cherché des heures, je ne poserais pas la question.
    J'ai essayé des choses avec execute immediate ou encore dbms_sql.desc_table.

  7. #7
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Comment veux-tu récupérer les données ?
    Un select en PL/SQL doit forcément avoir un INTO, que ce soit dans des variables (1 seule ligne) ou une collection (plusieurs lignes)

    Ta procédure ou fonction doit avoir un retour (RETURN pour une fonction, paramètre OUT pour une procédure).
    Tu peux aussi utiliser DBMS_OUPUT.

    Dans tous les cas, la procédure doit connaitre la définition des colonnes du Select.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  8. #8
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2016
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Ok comme je ne peux pas connaître la définition des colonnes du select , je change mon fusil d'épaule...

    J'ai une procédure déclarée comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE OR REPLACE PROCEDURE ReportEngineExecute2 (csStatement in varchar2, csSelect out varchar2)
      IS
      BEGIN
        execute immediate csStatement using out csSelect;
      END;
    /
    et un appel comme celui-ci
    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
     
    set serveroutput on;
     
    declare 
    csSelect varchar2(4000);
    csSelectFinal varchar2(4000);
     
    begin 
    csSelect:=
     
    'declare vch varchar2(500); begin :
    vch :=''SELECT USR.NOM AS USR,  JOURNAL.DT_MODIFICATION,  JOURNAL.MODIFICATION, PERSONNEL.NOM, PERSONNEL.PRENOM, JOURNAL.TYPE'';
     
    IF ''P'' != ''%'' then 
    vch := vch || '' WHERE JOURNAL.TYPE LIKE ''''P%'''' ''; 
    end if; 
     
    vch := vch || '' ORDER BY JOURNAL.DT_MODIFICATION DESC'';
     
    end;' 
    ;
     
     
    ReportEngineExecute2(csSelect,csSelectFinal);
    dbms_output.put_line(csSelectFinal);
     
    end;
    pourquoi le résultat obtenu vaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     SELECT USR.NOM AS USR,  JOURNAL.DT_MODIFICATION,  JOURNAL.MODIFICATION, PERSONNEL.NOM, PERSONNEL.PRENOM, JOURNAL.TYPE
    et non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     SELECT USR.NOM AS USR,  JOURNAL.DT_MODIFICATION,  JOURNAL.MODIFICATION, PERSONNEL.NOM, PERSONNEL.PRENOM, JOURNAL.TYPE WHERE JOURNAL.TYPE LIKE 'P%' ORDER BY JOURNAL.DT_MODIFICATION DESC

  9. #9
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Ton code est faux (sort en erreur à cause du : après le begin

    Si tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    declare vch varchar2(500); begin 
    :vch :=''SELECT USR.NOM AS USR,  JOURNAL.DT_MODIFICATION,  JOURNAL.MODIFICATION, PERSONNEL.NOM, PERSONNEL.PRENOM, JOURNAL.TYPE'';
    Alors avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execute immediate csStatement using out csSelect
    , csSelect va recevoir :vch
    Attention :vch n'est pas vch
    Dans un execute immediate, le nom des bind variables n'a aucun importance, Oracle les remplacera par :1, :2, :3 suivant l'ordre d'apparition (même si elles ont le même nom).

    Donc pour que ton code marche, il faut affecter la bind variable à la fin.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    DECLARE 
      csSelect varchar2(4000);
      csSelectFinal varchar2(4000);
    BEGIN 
    csSelect:= 'declare vch varchar2(500);
    begin 
    vch :=''SELECT USR.NOM AS USR,  JOURNAL.DT_MODIFICATION,  JOURNAL.MODIFICATION, PERSONNEL.NOM, PERSONNEL.PRENOM, JOURNAL.TYPE'';
     IF ''P'' != ''%'' then vch := vch || '' WHERE JOURNAL.TYPE LIKE ''''P%''''''; end if; 
     :retour := vch || '' ORDER BY JOURNAL.DT_MODIFICATION DESC'';
    end;' ;
     ReportEngineExecute2(csSelect,csSelectFinal);
     dbms_output.put_line(csSelectFinal);
    END;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  10. #10
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2016
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Je te remercie, çà marche parfaitement

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

Discussions similaires

  1. Exécuter des ordres PL/SQL dynamiquement ?
    Par Andre.lissarrague dans le forum PL/SQL
    Réponses: 2
    Dernier message: 15/11/2013, 14h41
  2. SQL dynamique temps d'exécution
    Par Mikadox dans le forum DB2
    Réponses: 2
    Dernier message: 25/06/2013, 17h22
  3. Réponses: 14
    Dernier message: 10/01/2007, 10h12
  4. SQL dynamique
    Par Etienne1 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 16/08/2004, 10h18
  5. SQL Dynamique - Materialized view
    Par Simeans2004 dans le forum SQL
    Réponses: 15
    Dernier message: 10/06/2004, 17h56

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