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

PostgreSQL Discussion :

problème d'appel de fonction sous postgresql


Sujet :

PostgreSQL

  1. #1
    Membre confirmé
    Profil pro
    Sr. Software Engineer
    Inscrit en
    Août 2007
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Software Engineer

    Informations forums :
    Inscription : Août 2007
    Messages : 169
    Par défaut problème d'appel de fonction sous postgresql
    slt j'execute un appel de focntion et j'obtiens le message d'erreur suivant et je ne comprends pas pourquoi.
    voici ma focntion


    CREATE OR REPLACE FUNCTION "public"."update_term_attribute" (varchar ,varchar, varchar) RETURNS boolean AS
    $body$
    DECLARE
    instance_rid ALIAS FOR $1; -- l_identifient du tuple
    attribute_name ALIAS FOR $2; -- le nom de l'attribut
    attribute_value ALIAS FOR $3; -- le nom de l_attribit dont on veut recuperer une valeur
    sql_query VARCHAR; -- une chaine de caracteres qui contient une commande SQL
    table_name VARCHAR;
    valeur VARCHAR;
    BEGIN
    table_name:="TermOccurancy_e";
    IF attribute_value ISNULL THEN
    sql_query := 'UPDATE "TermOccurancy_e" SET ' || attribute_name || ' = null WHERE RID = ' || instance_rid || ' ;';
    ELSE
    sql_query := 'UPDATE "TermOccurancy_e" SET ' || attribute_name || ' = '''|| attribute_value || '''
    WHERE RID = ' || instance_rid || ' ;';
    END IF;
    EXECUTE sql_query;



    RETURN TRUE;
    END;
    $body$
    LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

    qd j'execute

    SELECT update_term_attribute(15,'ref_termentry_rid',30);
    j'obtiens


    ERROR: function update_term_attribute(integer, "unknown", integer) does not exist at character 8
    HINT: No function matches the given name and argument types. You may need to add explicit type casts.

    pourtant la column ref_termentry_rid existe bien dans la table termoccurancy_e

    merci

  2. #2
    Membre émérite Avatar de Spoutnik
    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 672
    Par défaut
    Citation Envoyé par henpower Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE OR REPLACE FUNCTION 
    "public"."update_term_attribute" (varchar ,varchar, varchar) RETURNS boolean AS
    .....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT update_term_attribute(15,'ref_termentry_rid',30);

    ERROR: function update_term_attribute(integer, "unknown", integer) does not exist at character 8
    HINT: No function matches the given name and argument types. You may need to add explicit type casts.
    Hello,


    Tu déclare une fonction avec 3 arguments de type varchar, et tu lance une requete avec comme type d'arguments int, varchar, int
    Le message d'erreur est clair : il ne trouve pas de fonction avec le type d'arguments que tu lui passe.

    Soit tu change ta déclaration, soit tu change ta facon d'appeler ta fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT update_term_attribute('15','ref_termentry_rid','30');
    Je te conseille de changer le premier argument (l'id) en entier, ca va t'éviter qq "cast" de valeurs inutiles.

    ++

  3. #3
    Membre confirmé
    Profil pro
    Sr. Software Engineer
    Inscrit en
    Août 2007
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Software Engineer

    Informations forums :
    Inscription : Août 2007
    Messages : 169
    Par défaut
    j'ai changé le type de paramètre en int,varchar, int mais tjr rien
    sans doute justemen un pet de casting. comment le resoudre?
    merci

  4. #4
    Membre émérite Avatar de Spoutnik
    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 672
    Par défaut
    A part "ISNULL" au lieu de "IS NULL" , je ne vois pas à priori ce qui peut poser problème

    Si tu mets le 3e paramètre en int, tu peux virer les simples quote autour de attribute_value (dans la requete), tout comme pour instance_rid.

    Essaye de rajouter un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RAISE NOTICE ' query : % ', sql_query;
    avant d'executer ta requete, ca va peut etre t'aider à trouver le problème.

    (c'est toujours le même message d'erreur ?)

    ++

  5. #5
    Invité
    Invité(e)
    Par défaut
    C'est peut-être une question idiote, mais faire ceci:
    IF attribute_value ISNULL THEN
    sql_query := 'UPDATE "TermOccurancy_e" SET ' || attribute_name || ' = null WHERE RID = ' || instance_rid || ' ;';
    ELSE
    sql_query := 'UPDATE "TermOccurancy_e" SET ' || attribute_name || ' = '''|| attribute_value || '''
    WHERE RID = ' || instance_rid || ' ;';
    END IF;


    Ça ne revient pas a écrire NULL a la place de attribute_value seulement quand attribute_value est lui même a NULL ?

  6. #6
    Membre confirmé
    Profil pro
    Sr. Software Engineer
    Inscrit en
    Août 2007
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Software Engineer

    Informations forums :
    Inscription : Août 2007
    Messages : 169
    Par défaut tjrs pas de solution
    en fait il affiche l'erreure suivante

    column "termoccurancy_e" does not exist.
    je ne comprends pas du tout car dans ma bd g vois bien la table en question

  7. #7
    Membre confirmé
    Profil pro
    Sr. Software Engineer
    Inscrit en
    Août 2007
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Software Engineer

    Informations forums :
    Inscription : Août 2007
    Messages : 169
    Par défaut aide
    finalement mon pb persite et je ne vois pas ou peut venir l'erreur car lorsue j'execute cette requete de MAJ ds qsl editor ca fonctionne. sans doute un pb de passage de paramètre.

    alors est ce que quelqu'un peut m'ecrire une fonction en plpgsql qui prend en entrée le numero d'un tuple, une column , une valeur. et mais à jour la case correspondante tu tuple.
    ex: function maj(int num_tuple, varchar nom_colonne,vachar valeur)

    merci

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 128
    Par défaut
    Étant donné le message d'erreur que tu as donné, à savoir :

    column "termoccurancy_e" does not exist
    Il te parle d'une colonne, pas d'une table.

    Il serait bien qu'avant d'exécuter la requête, tu l'affiches dans les logs (instruction RAISE NOTICE, voir http://www.postgresql.org/docs/8.2/i...-messages.html pour les détails).

    Si le problème survient toujours, il faudrait que tu nous envoies ici le code actuel de la fonction, la requête qui l'exécute et le résultat complet (via psql par exemple).

  9. #9
    Membre confirmé
    Profil pro
    Sr. Software Engineer
    Inscrit en
    Août 2007
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Software Engineer

    Informations forums :
    Inscription : Août 2007
    Messages : 169
    Par défaut pb résolu
    slt
    finalement j'ai resolu mon pb. j'ai ecris la fonction suivant

    create or replace function(int ,text ,text) as
    DECLARE
    instance_rid ALIAS FOR $1; -- l_identifient du tuple
    attribute_name ALIAS FOR $2; -- le nom de la colonne
    attribute_value ALIAS FOR $3; -- la valeur à insérer
    BEGIN

    EXECUTE ' UPDATE table1 SET '|| quote_ident(attribute_name)|| ' = ' ||quote_literal(attribute_value)|| ' WHERE rid = ' ||quote_literal(instance_rid);


    END;

    language 'plpgsql';


    un petit commentaire: quote_ident(text) et quote_literal(text) sont des fonctions prédéfinies de postgre.
    ensuite j'ai surchagé (coe on le fais en poo) cette fonction pour les diverse configuration d'utilisation dont j'aurai besoin.

    merci pour vos reponse

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

Discussions similaires

  1. Problème d'appel à une fonction de Shell32.dll sous win server 2008
    Par ludogoal dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 05/06/2009, 15h06
  2. Problème d'appel de fonction
    Par claralavraie dans le forum Langage SQL
    Réponses: 1
    Dernier message: 16/12/2005, 20h17
  3. Réponses: 7
    Dernier message: 10/09/2005, 16h49
  4. [DLL] problème pour appeler une fonction d'une DLL
    Par bigboomshakala dans le forum MFC
    Réponses: 34
    Dernier message: 19/07/2004, 11h30
  5. Réponses: 4
    Dernier message: 19/04/2004, 13h41

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