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 :

Comment créer un select dynamique avec paramètres ?


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 79
    Points : 44
    Points
    44
    Par défaut Comment créer un select dynamique avec paramètres ?
    Bonjour à tous,

    J'essaie de faire cette requete dynamique sql mais rien n'y fait.
    J'ai cherché sur google mais c'est vraiment galère pour trouver de l'info là dessus
    Et sur les exemples de developpez.com... c'est clair sauf pour le select.

    Voici la requete:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    v_requete := 'SELECT NOM FROM INTERVENANTS WHERE :critere=:valeur';
    EXECUTE IMMEDIATE v_requete INTO v_result USING v_champ, p_table, p_critere, v_value;
    J'ai essayé avec un seul paramètre et ça fonctionne... seulement quand j'essaie d'insérer deux paramètres ça ne va plus

  2. #2
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Il faut autant de variable dans le USING que dans le SELECT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    v_requete := 'SELECT :champ FROM :table WHERE :critere=:valeur';
    EXECUTE IMMEDIATE v_requete 
    INTO v_result 
    USING v_champ, p_table, p_critere, v_value;

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 79
    Points : 44
    Points
    44
    Par défaut
    Effectivement, mais j'ai donné un mauvais exemple, la fatigue était dans un état avancé hier soir

    En fait je met bien toutes mes valeurs comme vous dites, mais il me dit que la table n'existe pas alors que j'ai re-vérifié, elle est bien là.

    Je viens d'essayer en spécifiant la colonne et la table, ça passe, mais quand je fait le INTO, il me dit qu'il n'y à pas de données ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    v_requete := 'SELECT NOM FROM INTERVENANTS WHERE :critere =:valeur';
     
    	  EXECUTE IMMEDIATE v_requete 
    	  INTO v_result 
    	  USING p_critere, v_value;

  4. #4
    Rédacteur
    Avatar de Bruno2r
    Homme Profil pro
    Exploitation des données
    Inscrit en
    Décembre 2006
    Messages
    2 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Exploitation des données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 566
    Points : 4 780
    Points
    4 780
    Par défaut variables
    Bonjour,
    Ne serait ce pas un problème de variable (type et taille) ?
    Comment les as tu définies ?
    Ca c'est pour il ne ramène rien (je suppose que le sélect direct exécuté avec critère et valeur du critère fonctionne)
    Pour le message la table n'existe pas (c'est parfois tout autre chose dans Oracle) as tu essayé de préciser le Owner.Table_name ?
    Bonne chance

  5. #5
    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
    Tu ne peux pas mettre de nom de colonne ou de table en dynamique

    Le Bind c'est remplacer une valeur par une autre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    EXECUTE IMMEDIATE 'SELECT 1 FROM DUAL WHERE :critere =:valeur'  INTO v_result 
    	  USING 'DUMMY', 'X';
    = du point de vue sql
    SELECT 1 FROM DUAL WHERE 'DUMMY' = 'X'
    Pour prendre en compte des noms de colonnes ou de table c'est en dur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    p_table := 'DUAL';
    p_col := 'DUMMY';
    EXECUTE IMMEDIATE 'SELECT 1 FROM ' || p_table || 'WHERE ' || p_col || ' = :valeur'  INTO v_result 
    	  USING 'X';
    Quand tu utilises des chaines pour de l'execute immediate, n'oublie pas de vérifier ce que tu as créé comme requete par un DBMS.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    v_requete := 'SELECT NOM FROM ' ||p_table ||'WHERE ' || p_critere || '=:valeur'; -- Erreur
    DBMS_OUTPUT.PUT_LINE(v_requete);
    	  EXECUTE IMMEDIATE v_requete 
    	  INTO v_result 
    	  USING v_value;

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 79
    Points : 44
    Points
    44
    Par défaut
    Super ça marche
    Un grand merci

    Mon problème venait du fait que l'on ne peut pas mettre un nom de table ou de colonne en dynamique comme dit par Mcm

  7. #7
    Rédacteur
    Avatar de Bruno2r
    Homme Profil pro
    Exploitation des données
    Inscrit en
    Décembre 2006
    Messages
    2 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Exploitation des données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 566
    Points : 4 780
    Points
    4 780
    Par défaut Bravo McM
    J'avais même pas vu qu'il mettait le nom de table en :table

    J'utilise aussi la concaténation 'sqltext ... FROM'|| varTable || 'WHERE ...'
    C'est tout de même du dynamic je trouve

    Je vois que McM est en forme même le week-end

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

Discussions similaires

  1. Comment créer un SELECT dynamiquement ?
    Par waxx59 dans le forum Doctrine2
    Réponses: 1
    Dernier message: 17/12/2012, 17h27
  2. Comment créer un croisé dynamique avec Mysql
    Par kamnouz dans le forum Requêtes
    Réponses: 2
    Dernier message: 04/06/2011, 22h10
  3. [DisplayTag] Créer un lien dynamique avec javascript
    Par babylone7 dans le forum Taglibs
    Réponses: 3
    Dernier message: 20/04/2005, 10h23
  4. [DisplayTag] Comment créer un lien dynamique
    Par tscoops dans le forum Taglibs
    Réponses: 3
    Dernier message: 17/02/2005, 09h53
  5. comment creer un alias dynamique avec BDE et ODBC
    Par david33 dans le forum C++Builder
    Réponses: 2
    Dernier message: 12/07/2002, 11h50

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