Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/08/2007, 17h46   #1
Membre du Club
 
Inscription : août 2007
Messages : 167
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 167
Points : 64
Points : 64
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
henpower est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 17h53   #2
Membre chevronné
 
Avatar de Spoutnik
 
Homme
Inscription : octobre 2003
Messages : 668
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : Etats-Unis

Informations forums :
Inscription : octobre 2003
Messages : 668
Points : 746
Points : 746
Citation:
Envoyé par henpower Voir le message
Code :
1
2
3
CREATE OR REPLACE FUNCTION 
"public"."update_term_attribute" (varchar ,varchar, varchar) RETURNS BOOLEAN AS
.....
Code :
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 :
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.

++
__________________
Two beer or not two beer. (Shakesbeer)
Question technique par MP => poubelle!
Spoutnik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 18h15   #3
Membre du Club
 
Inscription : août 2007
Messages : 167
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 167
Points : 64
Points : 64
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
henpower est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 18h49   #4
Membre chevronné
 
Avatar de Spoutnik
 
Homme
Inscription : octobre 2003
Messages : 668
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : Etats-Unis

Informations forums :
Inscription : octobre 2003
Messages : 668
Points : 746
Points : 746
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 :
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 ?)

++
__________________
Two beer or not two beer. (Shakesbeer)
Question technique par MP => poubelle!
Spoutnik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 21h13   #5
Invité régulier
 
Inscription : août 2007
Messages : 10
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 10
Points : 8
Points : 8
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 ?
Makkhdyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 22h11   #6
Membre du Club
 
Inscription : août 2007
Messages : 167
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 167
Points : 64
Points : 64
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
henpower est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 23h54   #7
Membre du Club
 
Inscription : août 2007
Messages : 167
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 167
Points : 64
Points : 64
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
henpower est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2007, 08h43   #8
Membre habitué
 
Inscription : août 2007
Messages : 128
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 128
Points : 146
Points : 146
Étant donné le message d'erreur que tu as donné, à savoir :

Citation:
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).
gleu_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2007, 14h36   #9
Membre du Club
 
Inscription : août 2007
Messages : 167
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 167
Points : 64
Points : 64
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
henpower est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h59.


 
 
 
 
Partenaires

Hébergement Web