Re: ERREUR: "$3" is declared CONSTANT

From: Christophe Chauvet <christophe(at)kryskool(dot)org>
To: Samuel ROZE <samuel(dot)roze(at)aliceadsl(dot)fr>
Cc: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: ERREUR: "$3" is declared CONSTANT
Date: 2008-08-31 17:22:20
Message-ID: 48BAD34C.3020506@kryskool.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

Bonsoir

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(at)toto(dot)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.
>>
>>
>>
>
>
>

In response to

Responses

Browse pgsql-fr-generale by date

  From Date Subject
Next Message Samuel ROZE 2008-08-31 17:49:17 Re: ERREUR: "$3" is declared CONSTANT
Previous Message Samuel ROZE 2008-08-31 10:01:02 Re: ERREUR: "$3" is declared CONSTANT