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 :

Problème variable dans une requete SQL


Sujet :

PL/SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Points : 11
    Points
    11
    Par défaut Problème variable dans une requete SQL
    Bonjour à tous,


    Voila le problème : J'ai deux variables cat (number ) et trie (varchar2) que j'aimerais insérer dans une requête.J'ai essayé beaucoup de choses à savoir (' '," ",|| || ...)
    Cependant , après de nombreuses recherches, je ne trouve pas la syntaxe.Pourriez vous svp m'aider !
    Voici le code où je voudrais insérer mes deux variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    create procedure formRevue (cat in number,trie in varchar2 default 'score') is
    ...
    ...
    	for ligne in
     (select nom_court,nom_long,nom,intitule,date_extraction,score,nb_article
      from revue,categorie,domaine,extraction,possession
    where possession.id_cat= categorie.id_cat
    and  categorie.id_domaine= domaine.id_domaine
    and revue.issn=extraction.issn
    and possession.issn = revue.issn
    and  "cat " = categorie.id_cat
    order by "trie")
    loop	 ET LA SUITE DE MON CODE !!!
    Merci d'avance à celui qui trouvera la solution !!!

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut
    Avec 5 sujets par jour sur l'utilisation des variables dans une requête, vous ne devriez pas chercher longtemps...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Points : 11
    Points
    11
    Par défaut
    si justement !!! je cherche depuis pas mal de temps et je trouve rien...Aurais tu une url à me proposer?

  4. #4

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Points : 11
    Points
    11
    Par défaut
    Je n'ai pas de execute immediate... Il n'est pas possible de faire ce que je vous ai expliqué auparavant comme quand je le fais en shell ( $variable )????

  6. #6
    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
    Une procédure Stockée en base est compilée avant d'être stockée.
    Une procédure en shell est recompilée à chaque lancement (après le remplacement des &var)

    Donc, pour tout ce qui est nom de colonne, nom de table paramétré, il faut passer par du Execute Immediate ou pour les curseur par un open mon_curseur for '...'

    Le '...' étant le select en chaine de caractère.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Points : 11
    Points
    11
    Par défaut
    donc pour mon cas, je n'ai pas d'autres solutions?
    Pouvez vous m'expliquer dans mon cas plus précisément t ce que je dois faire car c'est vraiment vague...

    Merci d'avance

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Points : 11
    Points
    11
    Par défaut
    Salut,

    Après avoir cherché encore tout hier, j'ai vraiment du mal à comprendre ce que je dois faire pour que je puisse insérer 2 variables dans mon select :/

    Si quelqu'un pouvait m'aider en m'expliquant vraiment ce que je dois faire... Ca serait sympa !

    Merci d'avance

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Il suffit d'utiliser le nom de vos paramètres dans votre curseur, un exemple simple :
    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
    create procedure p_toto ( p_dummy in char )
    is
    begin
     
        for c_toto in
        (
        select dummy || 'A' as dum
          from dual
         where dummy = p_dummy
        )
     
        loop
            dbms_output.put_line(c_toto.dum);
        end loop;
     
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    exec p_toto ('X');
     
    XA

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Points : 11
    Points
    11
    Par défaut
    le deuxieme code c'est quoi???

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Points : 11
    Points
    11
    Par défaut
    Je viens de me rendre compte que ma variable "cat" marchait bien dans la requête !! C'est déjà ça de gagner .
    En revanche c'est la variable trie qui ne marche pas...
    Cette variable prends des valeurs différentes en fonction de ce que choisis l'utilisateur dans un formulaire à savoir (nb_articles, score,nom_long,nom_court).
    MAis par défaut je met la variable trie= score .
    Et la requête de prend pas le order by trie en compte...

  12. #12
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Alors j'ai bien une solution, mais c'est vraiment pas propre, d'autres apporteront certainement une meilleure réponse que 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    CREATE procedure formRevue (p_cat IN number, p_tri IN varchar2 DEFAULT 'score') IS
     
    BEGIN
     
    FOR ligne IN
    (
    SELECT
        nom_court,
        nom_long,
        nom,
        intitule,
        date_extraction,
        score,
        nb_article
    FROM
        categorie
        inner join domaine
          on domaine.id_domaine = categorie.id_domaine
        inner join possession
          on possession.id_cat= categorie.id_cat
        inner join revue
          on revue.issn = possession.issn
        inner join extraction
          on extraction.issn = revue.issn
    WHERE
        categorie.id_cat = p_cat
    ORDER BY 
        case lower(p_tri)
          when 'nom_court'       then 1
          when 'nom_long'        then 2
          when 'nom'             then 3
          when 'intitule'        then 4
          when 'date_extraction' then 5
          when 'score'           then 6
          when 'nb_article'      then 7
          else 6
        end ASC
    )
     
    ...
    J'ai renommé les paramètres en p_ pour pouvoir facilement les identifier, et j'ai normalisé vos jointures. Il faudrait encore aliaser vos tables pour que ce soit parfait.

    Attention, si vous changez l'ordre des résultats dans le select il faudra bien modifier le case !

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Points : 11
    Points
    11
    Par défaut
    Merci pour vos réponses

  14. #14
    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
    C'est pas plutôt ceci que tu veux faire (nom de colonne paramétré) ?

    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
    DECLARE
    	TYPE CUR_TYP	IS REF CURSOR;
    	v_cur					CUR_TYP;
    	p_col VARCHAR2(30) := 'DUMMY';
      v_result VARCHAR2(30);
    BEGIN
        OPEN v_cur FOR 'SELECT '|| p_col ||' FROM DUAL';
        LOOP
        	FETCH v_cur INTO v_result;
          EXIT WHEN v_cur%NOTFOUND OR v_cur%NOTFOUND IS NULL;
          DBMS_OUTPUT.PUT_LINE('resultat:'|| v_result);
        END LOOP;
        CLOSE v_cur;
    END;
     
    resultat:X
    Avec p_col VARCHAR2(30) := 'TO_CHAR(SYSDATE)';
    resultat:30-NOV-09

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/07/2010, 12h10
  2. INSERER UNE VARIABLE DANS UNE REQUETE SQL
    Par MATLABIEN dans le forum MATLAB
    Réponses: 0
    Dernier message: 13/07/2010, 15h13
  3. Utililiser une variable dans une requete SQL
    Par le_misterioso dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 10/07/2009, 11h31
  4. BO 5.1 Champ variable dans une requete SQL
    Par Sergio63 dans le forum Deski
    Réponses: 1
    Dernier message: 21/05/2007, 11h45
  5. utilisation d'une variable dans une requete SQL
    Par ezneti dans le forum Visual C++
    Réponses: 1
    Dernier message: 30/04/2007, 09h47

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