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