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

Requêtes PostgreSQL Discussion :

Probleme création fonction avec code sql


Sujet :

Requêtes PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Femme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Février 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux

    Informations forums :
    Inscription : Février 2013
    Messages : 9
    Par défaut Probleme création fonction avec code sql
    Bonjour à tous,

    Je me lance dans la création de fonction Postgresql afin de pouvoir les appeler ensuite d'un autre outil (Talend). J'ai souhaité commencer avec quelque chose de simple mais que je n'arrive pas a faire fonctionner : une fonction qui vide la table entrée en argument. Ma table de test s'appelle test_2. Evidemment, quand je la vide via une commande SQL (DELETE FROM test_2), aucun souci particulier. Voici le code de ma fonction qui est censée faire la même chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE OR REPLACE FUNCTION public.fonction_test(table_name name)
      RETURNS void AS
    $BODY$BEGIN
    DELETE FROM table_name;
    END$BODY$
      LANGUAGE plpgsql VOLATILE STRICT
      COST 100;
    ALTER FUNCTION public.fonction_test(name)
      OWNER TO postgres;

    Quand je l'execute avec ma table test_2 en argument ( SELECT fonction_test(test_2) ); voici le résultat :

    ERREUR: la colonne « test_2 » n'existe pas
    LINE 1: SELECT fonction_test(test_2);
    ^
    ********** Erreur **********

    ERREUR: la colonne « test_2 » n'existe pas
    État SQL :42703
    Caractère : 22
    --> Je n'arrive pas a comprendre pourquoi mon argument est interprété comme un nom de colonne au lieu d'un nom de table....

    En entrant l'argument entre guillemet simple ( SELECT fonction_test('test_2') ), le résultat est différent :

    ERREUR: la relation « table_name » n'existe pas
    LINE 1: DELETE FROM table_name
    ^
    QUERY: DELETE FROM table_name
    CONTEXT: fonction PL/pgsql fonction_test(name), ligne 2 à instruction SQL

    ********** Erreur **********

    ERREUR: la relation « table_name » n'existe pas
    État SQL :42P01
    Contexte : fonction PL/pgsql fonction_test(name), ligne 2 à instruction SQL
    Est ce que quelqu'un aurez une solution a me proposer svp ?

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    Il faut passer par du SQL dynamique, c'est à dire demander l'exécution avec la commande EXECUTE SQL d'une commande qui aura été construite à partir des variables.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXECUTE SQL 'DELETE FROM ' || tablename;
    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
    Membre habitué
    Femme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Février 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux

    Informations forums :
    Inscription : Février 2013
    Messages : 9
    Par défaut
    Merci pour votre réponse. J'ai testé avec la commande "EXECUTE SQL" en paramétrant la fonction en Langage plpgsql, ce qui donne le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE OR REPLACE FUNCTION public.fonction_test(table_name name) RETURNS void AS
    $BODY$BEGIN
    EXECUTE SQL 'DELETE FROM ' || table_name;
    END$BODY$
    LANGUAGE plpgsql VOLATILE NOT LEAKPROOF
    COST 100;
    Quand j'execute ma fonction, le message d'erreur est toujours le même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT fonction_test(test_2);
    ERREUR: la colonne « test_2 » n'existe pas
    LINE 1: SELECT fonction_test(test_2);
    ^
    ********** Erreur **********

    ERREUR: la colonne « test_2 » n'existe pas
    État SQL :42703
    Caractère : 22

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    test_2 non encadré d'apostrophes est reconnu comme un nom de colonne par PostgreSQL qui va en chercher la valeur.
    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
    Membre habitué
    Femme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Février 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux

    Informations forums :
    Inscription : Février 2013
    Messages : 9
    Par défaut
    Merci pour l'info. Une autre erreur empêchait ma fonction de fonctionner. Il faut écrire "EXECUTE" au lieu de "EXECUTE SQL". Ce qui donne comme code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE OR REPLACE FUNCTION public.fonction_test(table_name name) RETURNS void AS
    $BODY$BEGIN
    EXECUTE 'DELETE FROM ' || table_name;
    END$BODY$
    LANGUAGE plpgsql VOLATILE NOT LEAKPROOF
    COST 100;
    Merci pour votre aide

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    en fait c'est EXECUTE IMMEDIATE
    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.

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

Discussions similaires

  1. Traduction fonction SAS Code SQL en SAS Guide
    Par mariekoala dans le forum Outils BI
    Réponses: 2
    Dernier message: 20/06/2009, 20h25
  2. probleme de débutant avec code blocks
    Par Arwel dans le forum Code::Blocks
    Réponses: 9
    Dernier message: 06/09/2007, 14h12
  3. Réponses: 1
    Dernier message: 19/03/2007, 20h57
  4. [SQL plus][pl/sql] Probleme de spool avec PL/SQL
    Par ingamo dans le forum PL/SQL
    Réponses: 2
    Dernier message: 08/02/2007, 09h38
  5. Création BD Access Code SQL pour relation 1-1 ?
    Par colorid dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 26/10/2005, 16h42

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