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 :

Utiliser un paramètre en nom de variable dans un filtre [12c]


Sujet :

PL/SQL Oracle

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Chargé de sélection client
    Inscrit en
    Février 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de sélection client

    Informations forums :
    Inscription : Février 2017
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Utiliser un paramètre en nom de variable dans un filtre
    Bonjour,

    Je souhaite mettre un filtre sur une colonne dont le nom est passé en paramètre mais je ne trouve pas la solution après plusieurs essais. var_periode sera donc le nom d'une colonne de ma table factu. Voici l'idée :

    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
     
        PROCEDURE proc_vol(
            var_periode IN VARCHAR2,
            nature IN VARCHAR2,
            rc OUT SYS_REFCURSOR
        ) IS BEGIN
     
            OPEN rc FOR
     
                SELECT  SUM(volume_m3)
                FROM    factu
                WHERE   var_periode = 1
                  AND   factu.nature_transaction = nature;                        
     
        END proc_vol;
    Pourriez vous m'aidez vp? Je ne vois pas comment régler mon soucis.

    Merci

  2. #2
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Et si tu faisais du SQL Dynamqiue en passant par EXECUTE IMMEDIATE?

    https://sheikyerbouti.developpez.com/execute_immediate/
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  3. #3
    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
    Exemple avec des curseurs

    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
    DECLARE
    	TYPE cur_typ	IS REF CURSOR;
      v_cur			    cur_typ;
      v_table varchar2(30) := 'DUAL';
      v VARCHAR2(1) := 'X';
      v_retour VARCHAR2(1);
    BEGIN
    		OPEN v_cur FOR 'SELECT dummy FROM '|| v_table ||' where dummy = :x' USING v;
    		LOOP
    			FETCH v_cur INTO v_retour;
    			EXIT WHEN v_cur%NOTFOUND OR v_cur%NOTFOUND IS NULL;
    			DBMS_OUTPUT.put_line(v_retour);
    		END LOOP;
    		CLOSE v_cur;
    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

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Chargé de sélection client
    Inscrit en
    Février 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de sélection client

    Informations forums :
    Inscription : Février 2017
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Bonjour. Merci pour vos réponses, j'avais essayé ces solutions mais sans succès, j'ai réessayé mais je ne comprends pas où ça bloque, le package s’exécute bien mais je ne trouve pas le bon résultat. Voici mon code modifié :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        PROCEDURE proc_vol(
            var_periode IN VARCHAR2,
            nature IN VARCHAR2,
            rc OUT SYS_REFCURSOR
        ) IS BEGIN
     
            OPEN rc FOR
     
                'SELECT  SUM(volume_m3)
                FROM    factu
                WHERE  factu.' || var_periode ||'= 1
                AND   factu.nature_transaction = nature';                        
     
        END proc_vol;

  5. #5
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 731
    Points : 1 416
    Points
    1 416
    Par défaut
    Bonsoir,

    Chez Oracle les procédures stockées n'ont pas de primitives de sortie ; ce qui veut dire qu'un SELECT simple n'est pas admis dans l’exécution.

    Plusieurs syntaxes de contournement sont possibles, mais toutes passent par le package DMS_OUTPUT.

    Essayer de mieux relire et suivre l'exemple de McM
    Le savoir est une nourriture qui exige des efforts.

  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
    En fait tu veux juste faire un SUM (une seule ligne de retour), pourquoi utiliser un curseur ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    FUNCTION proc_vol(
            var_periode IN VARCHAR2,
            nature IN VARCHAR2) RETURN NUMBER
    IS 
     v_retour NUMBER;
    BEGIN
     EXECUTE IMMEDIATE 'SELECT  SUM(volume_m3) FROM  factu WHERE  factu.' || var_periode ||'= 1 AND   factu.nature_transaction = nature' INTO v_retour;                        
     RETURN v_retour;
    END proc_vol;
    Info : pour débuger le execute immediate, utiliser une variable en VARCHAR2 pour l'ordre exécuté, et faire un DBMS_OUTPUT de cet ordre afin de voir la requête exécutée.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Chargé de sélection client
    Inscrit en
    Février 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de sélection client

    Informations forums :
    Inscription : Février 2017
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Pour le cursor ça m'a été "imposé". Effectivement c'était plus simple que ce que je pensais, voici que j'ai fait :


    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
    PROCEDURE proc_vol(
            var_periode IN VARCHAR2,
            nature IN VARCHAR2,
            rc OUT SYS_REFCURSOR
        ) IS 
     
        my_rq VARCHAR2(5000);
     
    BEGIN
     
    my_rq := 'SELECT  SUM(volume_m3)
    FROM    factu
    WHERE  factu.' || var_periode ||'= 1
    AND   factu.nature_transaction = ''' || nature_transaction || '''';     
     
    OPEN rc FOR my_rq                    
     
        END proc_vol;
    Merci pour votre aide

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

Discussions similaires

  1. utilisation des noms des variables dans les conditions
    Par ankhaline dans le forum SAS Base
    Réponses: 4
    Dernier message: 14/08/2010, 14h34
  2. nom de variable dans un string
    Par vincenth_30 dans le forum C++
    Réponses: 7
    Dernier message: 31/07/2007, 18h34
  3. [Question] Doit-on traduire les noms de variables dans le code?
    Par r0d dans le forum Traduction Penser en C++
    Réponses: 4
    Dernier message: 21/02/2007, 20h54
  4. include + nom de variable dans JSP
    Par Mister Nono dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 19/09/2006, 11h27
  5. Nom de variable dans une autre variable
    Par lsdInside dans le forum Linux
    Réponses: 5
    Dernier message: 04/12/2004, 19h36

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