Re: ERREUR: "$3" is declared CONSTANT

Lists: pgsql-fr-generale
From: Samuel ROZE <samuel(dot)roze(at)aliceadsl(dot)fr>
To: pgsql-fr-generale(at)postgresql(dot)org
Subject: ERREUR: "$3" is declared CONSTANT
Date: 2008-08-31 09:48:44
Message-ID: 1220176124.6554.8.camel@samuel-laptop
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-fr-generale

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.


From: Samuel ROZE <samuel(dot)roze(at)aliceadsl(dot)fr>
To: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: ERREUR: "$3" is declared CONSTANT
Date: 2008-08-31 10:01:02
Message-ID: 1220176862.6554.14.camel@samuel-laptop
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-fr-generale

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.
>
>


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
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.
>>
>>
>>
>
>
>


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

Très intérressant !

Merci beaucoup, je vais mettre ça en place, le code sera un peu plus
clair :)

Merci !

Le dimanche 31 août 2008 à 19:22 +0200, Christophe Chauvet a écrit :
> 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.
> >>
> >>
> >>
> >
> >
> >
>
>


From: Guillaume Lelarge <guillaume(at)lelarge(dot)info>
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 21:10:52
Message-ID: 48BB08DC.8090300@lelarge.info
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-fr-generale

Samuel ROZE a écrit :
> [...]
> 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;
> -------------------------
>

Rien à voir avec ta question, mais juste pour infos, si tu utilises une
version 8.2 ou supérieure, tu peux remplacer :

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;

par

INSERT INTO clients.contacts (nom, email, _trigger) VALUES (p_nom,
p_email, p_t) RETURNING id INTO v_id;

--
Guillaume.
http://www.postgresqlfr.org
http://dalibo.com


From: Samuel ROZE <samuel(dot)roze(at)aliceadsl(dot)fr>
To: Guillaume Lelarge <guillaume(at)lelarge(dot)info>
Cc: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: ERREUR: "$3" is declared CONSTANT
Date: 2008-08-31 21:17:10
Message-ID: 1220217430.6554.28.camel@samuel-laptop
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-fr-generale

Très intéressant !

Cette liste est une source de bonheur ! :D

Merci :)

Le dimanche 31 août 2008 à 23:10 +0200, Guillaume Lelarge a écrit :
> Samuel ROZE a écrit :
> > [...]
> > 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;
> > -------------------------
> >
>
> Rien à voir avec ta question, mais juste pour infos, si tu utilises une
> version 8.2 ou supérieure, tu peux remplacer :
>
> 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;
>
> par
>
> INSERT INTO clients.contacts (nom, email, _trigger) VALUES (p_nom,
> p_email, p_t) RETURNING id INTO v_id;
>
>


From: Pascal Brognez <pascal62fr(at)free(dot)fr>
To: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: ERREUR: "$3" is declared CONSTANT
Date: 2008-09-01 05:51:45
Message-ID: 48BB82F1.4060301@free.fr
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-fr-generale

Guillaume Lelarge a écrit :

Salut,

> Samuel ROZE a écrit :

> Rien à voir avec ta question, mais juste pour infos, si tu utilises une
> version 8.2 ou supérieure, tu peux remplacer :
>
> 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;
>
> par
>
> INSERT INTO clients.contacts (nom, email, _trigger) VALUES (p_nom,
> p_email, p_t) RETURNING id INTO v_id;
>
>

Je me demandais justement comment récupérer la valeur d'un identifiant
de type Serial lors de la création d'un enregistrement.

Y-a-t-il des nouveautés pour modifier une valeur dans un enregistrement?

Cordialement
--
Pascal


From: Guillaume Lelarge <guillaume(at)lelarge(dot)info>
To: Pascal Brognez <pascal62fr(at)free(dot)fr>
Cc: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: ERREUR: "$3" is declared CONSTANT
Date: 2008-09-01 06:10:46
Message-ID: 48BB8766.2070801@lelarge.info
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-fr-generale

Pascal Brognez a écrit :
> Guillaume Lelarge a écrit :
>> Samuel ROZE a écrit :
> [...]
>> Rien à voir avec ta question, mais juste pour infos, si tu utilises une
>> version 8.2 ou supérieure, tu peux remplacer :
>>
>> 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;
>>
>> par
>>
>> INSERT INTO clients.contacts (nom, email, _trigger) VALUES (p_nom,
>> p_email, p_t) RETURNING id INTO v_id;
>>
>>
>
> Je me demandais justement comment récupérer la valeur d'un identifiant
> de type Serial lors de la création d'un enregistrement.
>

Pour être plus complet, ça permet de renvoyer n'importe quelle
information. La partie RETURNING est l'équivalent d'un SELECT. On
pourrait avoir par exemple:

INSERT INTO clients.contacts (nom, email, _trigger)
VALUES (p_nom, p_email, p_t)
RETURNING id, p_nom, 10+3 INTO v_id, v_nom, v_calcul;

> Y-a-t-il des nouveautés pour modifier une valeur dans un enregistrement?
>

Vu le côté très imprécis de la question, je ne vois pas comment on
pourrait répondre. Précise ta question s'il-te-plaît.

--
Guillaume.
http://www.postgresqlfr.org
http://dalibo.com


From: Pascal Brognez <pascal62fr(at)free(dot)fr>
To: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: ERREUR: "$3" is declared CONSTANT
Date: 2008-09-01 06:40:52
Message-ID: 48BB8E74.7070308@free.fr
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-fr-generale

Guillaume Lelarge a écrit :
> Pascal Brognez a écrit :
>> Guillaume Lelarge a écrit :

Bonjour,

> Pour être plus complet, ça permet de renvoyer n'importe quelle
> information. La partie RETURNING est l'équivalent d'un SELECT. On
> pourrait avoir par exemple:
>
> INSERT INTO clients.contacts (nom, email, _trigger)
> VALUES (p_nom, p_email, p_t)
> RETURNING id, p_nom, 10+3 INTO v_id, v_nom, v_calcul;
>
>> Y-a-t-il des nouveautés pour modifier une valeur dans un enregistrement?
> Précise ta question s'il-te-plaît.

Oui dans un autre thread après le café.

Cordialement
--
Pascal