Si vous vouliez reutiliser la variable que vous avez passer en argument
a votre fonction, il aurait fallu la déclaré comme ceci
CREATE OR REPLACE FUNCTION clients.contact (p_nom text, p_email text,
inout p_t integer) RETURNS integer AS $contact$
l'utilisation de INOUT permet de passer la variable en argument de la
fonction, mais également de changer sa valeur pour la recupérer après le
retour de la fonction
ex schématique
a = 5
x = client.contact('toto', 'toto@toto.com', a)
print a
(dans votre exemple ici a vaudrait 1)
OUT et INOUT sont disponible depuis PostgreSQL 8.1
Cordialement,
Christophe Chauvet.
Samuel ROZE a écrit :
> Re-Bonjour,
>
> Une erreur très bête et en fait, très explicite :
>
> C'était cette portion du code qui posait problème :
>
>
>> IF (p_t != 0) THEN
>> p_t := 1;
>> END IF;
>>
>
> En fait, la variable "p_t" est une constante donc je n'ai pas le droit
> de la modifier, il faut donc que je passe par une autre variable.
>
> A bientôt.
> Samuel.
>
> Le dimanche 31 août 2008 à 11:48 +0200, Samuel ROZE a écrit :
>
>> Bonjour à tous,
>>
>> J'ai crééer une fonction appelée "contact" dans ma base de données, qui,
>> quand on l'appelle, renvoi l'ID du contact avec les noms et email donnés
>> en paramètre. Si il n'y a pas de contact de ce nom/email, elle le créé
>> et retourne à nouveau l'ID.
>>
>> Voici la structure de la table "contacts" :
>> +-----------------+
>> | contacts |
>> +-----------------+
>> | id SERIAL |
>> | nom text |
>> | email text |
>> | actif integer |
>> | maj timestamptz |
>> | _trigger integer|
>> +-----------------+
>>
>> Le dernier champ, "_trigger" sert à dire ou non si on veut que le
>> trigger s'éxécute pour l'enregistrement.
>>
>> Maintenant, voici le code de ma fonction "contact" :
>>
>> -------------------------
>> CREATE OR REPLACE FUNCTION clients.contact (p_nom text, p_email text,
>> p_t integer) RETURNS integer AS $contact$
>> DECLARE
>> v_id integer DEFAULT 0;
>> BEGIN
>> IF (p_t != 0) THEN
>> p_t := 1;
>> END IF;
>> SELECT id INTO v_id FROM clients.contacts WHERE nom = p_nom AND
>> email = p_email LIMIT 1;
>> IF NOT FOUND THEN
>> INSERT INTO clients.contacts (nom, email, _trigger) VALUES
>> (p_nom, p_email, p_t);
>> SELECT id INTO v_id FROM clients.contacts WHERE nom = p_nom AND
>> email = p_email LIMIT 1;
>> END IF;
>> RETURN v_id;
>> END;
>> $contact$ language plpgsql;
>> -------------------------
>>
>> Lorsque j'essaye de créer cette fonction, le compilateur plpgsql me sort
>> cette erreur :
>>
>> -------------------------
>> 5-clients-fonctions.sql:21: ERREUR: "$3" is declared CONSTANT
>> CONTEXT: compile of PL/pgSQL function "contact" near line 10
>> -------------------------
>>
>> La ligne 21 correspond à la ligne où il y as la requête "INSERT" dans la
>> fonction "contact".
>>
>> Auriez-vous une idée sur le pourquoi de cette erreur ?
>>
>> Merci d'avance !
>> Cordialement, Samuel ROZE.
>>
>>
>>
>
>
>
--
Sent via pgsql-fr-generale mailing list (pgsql-fr-generale@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-fr-generale
No comments:
Post a Comment