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 :

Exemple pl/sql dynamique simple


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 93
    Par défaut Exemple pl/sql dynamique simple
    Bonjour,

    j'avoue ne pas comprendre très bien comment marche le pl/sql dynamique et je voudrais que vous me fassiez un exemple à partir de mon problème :

    Dans une procédure stockée je passe un paramètre qui peut prendre 3 valeurs (0,1,2). En fonction de cette valeur je dois rajouter ou non un terme dans ma clause WHERE qui en contient déjà plusieurs en fait.

    En pseudo-code voila ce que cela donne approximativement
    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
     
    MaProcedure(blabla varchar2, blibli varchar2, typeClause varchar2) As
     
    SELECT Moumoute, Perruque
    FROM TETE
    WHERE
        blabla = bobo
        AND blibli = baba
        AND (
               SI typeClause = 0
                    Moumoute = 'brune'
               SI typeClause = 1
                    Moumoute = 'blonde'
               SI  typeClause = 2
                    Perruque = 'pouet'
       )
    End MaProcedure;
    Je ne sais pas si je suis très clair au final...
    Merci pour toute aide.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Par défaut
    Salut,

    Ca consiste à stocker ta requête dans une variable, puis l'exécuter avec un execute_immediate(); .

    En l'occurence, en ayant déclaré clause et requete comme des chaines de caractère suffisamment longue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if typeclause = 0 then clause := 'Moumoute = ''brune''';
    elsif typeclause = 1 then clause := 'Moumoute = ''blonde''';
    elsif typeclause = 2 then clause := 'Perruque = ''pouet''';
    end if;
     
    requete := 'SELECT Moumoute, Perruque FROM TETE WHERE ..... AND ' || clause || ';';
     
    execute_immediate(requete);
    Je garantis pas qu'il n'y ait pas d'erreur de syntaxe, j'ai plus vraiment le temps là, je repasserai plus tard

  3. #3
    Expert confirmé 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
    Par défaut
    Pas besoin d'un sql dynamique pour ça, un simple decode suffit

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 93
    Par défaut
    Merci Snipah!!

    mnitu, pourrais-tu détailler un peu plus s'il te plaît?

  5. #5
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE moumoute = DECODE(typeclause , 0,'brune', 1,'blonde', 2,'pouet')

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Par défaut
    Lorsque typeclause est égal à 2, le champs à tester est Perruque, et non moumoute.
    Pour utiliser le decode, on pourrait faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE moumoute LIKE DECODE(typeclause , 0,'brune', 1,'blonde', '%')
    AND Perruque LIKE DECODE(typeclause, 2,'pouet', '%')
    Le problème étant qu'il ne renverra pas les lignes où Perruque ou Moumoute n'est pas renseigné.

Discussions similaires

  1. Prob SQL dynamique
    Par anthony8 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 30/09/2004, 09h53
  2. Appel de function en SQL Dynamique
    Par dkd dans le forum Oracle
    Réponses: 22
    Dernier message: 28/09/2004, 18h01
  3. SQL dynamique : pb de syntaxe
    Par Pasiphae dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/08/2004, 16h50
  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