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

Requêtes PostgreSQL Discussion :

Utilisation de variable dans une fonction [9.4]


Sujet :

Requêtes PostgreSQL

  1. #1
    Nouveau membre du Club Avatar de I folima Elda
    Homme Profil pro
    Programmeur & Intégrateur
    Inscrit en
    décembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Programmeur & Intégrateur

    Informations forums :
    Inscription : décembre 2007
    Messages : 34
    Points : 34
    Points
    34
    Par défaut Utilisation de variable dans une fonction
    Bonjour,

    Je reviens de nouveau vers vous. Ca fait 1j et demi que je cherche, lis, teste sans succès mon code. Ce dernier doit être simple pour des experts mais là, je m'arrache les cheveux.
    Est-il possible d'avoir une correction de ce code? (avec quelques explication?). Je remercie d'avance
    Tout ce que je désire, c'est mettre le nom de ma table en mode 'schema.table' dans mon appelle de fonction avec le SELECT, récupérer ça pour ma fonction et faire les requêtes requises qui seront des DROP pour la plupart et quelques create pour une minorité.

    mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE or replace FUNCTION maFonction(tarteenpion varchar) RETURNS void AS $$
    	DECLARE
    		MOIS_MM		varchar := to_char(current_timestamp, 'MM');
    		ANNEE_AAAA	varchar := to_char(current_timestamp, 'YYYY');
    		ANNEE_AA	varchar := to_char(current_timestamp, 'YY');
     
    		cmd varchar := 'DROP TABLE IF EXISTS ' || tarteenpion || ';' ;
    	BEGIN
    		execute cmd;
    	END;
    $$ LANGUAGE plpgsql;
    SELECT maFonction(:table_purge);
    DROP FUNCTION maFonction(tarteenpion varchar);
    Pour info, la variable :table_purge viens du script shell primaire qui appelle ce script .sql. A première vue, la variabilisation se fait correctement. C'est son utilisation par la suite qui pose soucis.

    Mes différents tests ont été les suivants, sachant que j'ai mis en dur ma variable :table_purge (je mettrai à jour au fur et à mesure mes tests)
    • SELECT maFonction(matable); => ERROR: column "matable" does not exist
    • SELECT * FROM maFonction(matable); => ERROR: column "matable" does not exist
    • SELECT maFonction(schema.matable); => ERROR: missing FROM-clause entry for table "schema"
    • SELECT * FROM maFonction(schema.matable); => ERROR: missing FROM-clause entry for table "schema"
    • EXECUTE FUNCTION maFonction(schema.matable); => ERROR: syntax error at or near "maFonction"

    J'en oublie sûrement aussi.
    Voilà, j'espère que quelqu'un pourra m'apporter une correction qui fonctionne.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    8 336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 8 336
    Points : 27 146
    Points
    27 146
    Par défaut
    Pour rappel, une chaîne de caractères doit être encadrée d'apostrophes.
    En l'absence de ces caractères d'encadrement, elle est reconnue comme un nom d'objet ou de variable.
    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
    Nouveau membre du Club Avatar de I folima Elda
    Homme Profil pro
    Programmeur & Intégrateur
    Inscrit en
    décembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Programmeur & Intégrateur

    Informations forums :
    Inscription : décembre 2007
    Messages : 34
    Points : 34
    Points
    34
    Par défaut
    Lorsque j'écris en dur la nom de la table et que je l'exécute via \i monscript.sql , il n'y a pas de soucis ça marche.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT maFonction('schema.table');
    Maintenant, si je généralise en utilsant ma variable extérieur et que j'appelle mon script .sh, là rien ne va plus ( :table_purge contient schema.table )
    • SELECT maFonction(:table_purge); => ERROR: missing FROM-clause entry for table "schema"
      ------------------------------------------------------------LIGNE 1 : SELECT maFonction(schema.table);
      -----------------------------------------------------------------------------------------^
    • SELECT maFonction(":table_purge"); => ERROR: column ":table_purge" does not exist
      ------------------------------------------------------------LIGNE 1 : SELECT maFonction(":table_purge");
      -----------------------------------------------------------------------------------------^
    • SELECT maFonction(':table_purge'); => ERROR: syntax error at or near ":"
      ------------------------------------------------------------LIGNE 1 : DROP TABLE IF EXISTS :table_purge;
      --------------------------------------------------------------------------------------------^


    Dans le dernier cas (donc avec ' ), on voit bien que la variable :table_purge a bien été intégrer dans la fonction mais n'a pas été variabiliser correctement avec schema.table.
    Dans le 1er cas, (donc sans ' ), on voit bien que la variable :table_purge n'a pas été intégrer dans la fonction mais a été variabiliser correctement avec schema.table.
    Il faudrait un mixe entre les deux je suppose. Tu as une correction à me proposer @al1_24?

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    8 336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 8 336
    Points : 27 146
    Points
    27 146
    Par défaut
    Malheureusement, je ne pratique pas PotgreSQL et encore moins son langage procédural.
    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.

  5. #5
    Nouveau membre du Club Avatar de I folima Elda
    Homme Profil pro
    Programmeur & Intégrateur
    Inscrit en
    décembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Programmeur & Intégrateur

    Informations forums :
    Inscription : décembre 2007
    Messages : 34
    Points : 34
    Points
    34
    Par défaut
    A force de recherche et de demande d'aide, j'ai fini par avoir la solution (il me reste à l'appliquer à tout mon projet mais à première vu, dans mon script test, ça fonctionne).
    Je la pose ici l'ensemble du code du projet pour ceux qui souhaiterai faire quelque chose de similaire

    Code Dans le script .sh principal: appelant le/les script(s) .sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    psql "paramètres connexion" -f ./monscript.sql -v var1 = "schema.table"

    Code Dans le/les script(s): faisant les différents travaux souhaités : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE or replace FUNCTION maFonction(tarteenpion varchar) RETURNS void AS $$
    	DECLARE
    		MOIS_MM		varchar := to_char(current_timestamp, 'MM');
    		ANNEE_AAAA	varchar := to_char(current_timestamp, 'YYYY');
    		ANNEE_AA	varchar := to_char(current_timestamp, 'YY')
    		cmd varchar := 'DROP TABLE IF EXISTS ' || tarteenpion || ';' ;
    	BEGIN
    		execute cmd;
    	END;
    $$ LANGUAGE plpgsql;
    
    SELECT maFonction(:'var1');
    DROP FUNCTION maFonction(tarteenpion varchar);
    Oui, les simples cotes son autour du nom de la variable et le : sont à l'extérieur des simples cotes.

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

Discussions similaires

  1. Utiliser variable dans une fonction
    Par mikael2235 dans le forum Langage
    Réponses: 1
    Dernier message: 27/02/2012, 15h39
  2. Utilisation des variables dans une fonction
    Par DeLorbe dans le forum Débuter
    Réponses: 6
    Dernier message: 05/02/2010, 11h50
  3. Utiliser des variables dans une fonction
    Par zugolin dans le forum Langage
    Réponses: 7
    Dernier message: 10/04/2009, 16h11
  4. Utilisation d'une variable dans une fonction
    Par jean tof dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 27/04/2007, 16h34
  5. utilisation d'une variable dans une fonction
    Par chrgui dans le forum Langage
    Réponses: 3
    Dernier message: 16/01/2007, 21h14

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