Re: RETURN cannot have a parameter in function with OUT parameters

Lists: pgsql-fr-generale
From: Samuel ROZE <samuel(dot)roze(at)aliceadsl(dot)fr>
To: pgsql-fr-generale(at)postgresql(dot)org
Subject: RETURN cannot have a parameter in function with OUT parameters
Date: 2008-09-02 11:40:22
Message-ID: 1220355622.7881.1.camel@samuel-laptop
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-fr-generale

Bonjour à tous,

Toujours dans mon fonction "contact" de la dernière fois, PostgreSQL me
sort une erreur bizare avec une simple fonction plpgsql...

"5-clients-fonctions.sql:36: ERREUR: RETURN cannot have a parameter in
function with OUT parameters sur ou près de « v_id » at character 1486"

Je ne comprend vraiment pas qu'est-ce qu'il ce passe... Pouvez-vous
m'aider ? Ci-dessous la fonction concernée.

-----------------------
CREATE OR REPLACE FUNCTION clients.contact (p_nom text, p_email text,
inout TRIGGER integer) RETURNS integer AS $contact$
DECLARE
v_id integer DEFAULT 0;
BEGIN
IF (TRIGGER != 0) THEN
TRIGGER := 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
-- Le couple nom/email n'as pas été trouvé. Cependant, est-ce
que l'adresse mail
-- existe déjà et est acceptée ?
PERFORM id FROM clients.contacts WHERE email = p_email AND actif
= 1;
IF FOUND THEN
TRIGGER := 0;
END IF;
INSERT INTO clients.contacts (nom, email, _trigger) VALUES
(p_nom, p_email, TRIGGER) RETURNING id INTO v_id;
IF (v_trigger = 0) THEN
-- Si on as choisi de pas faire éxécuter les triggers, mais
que l'on passe par ce trigger
-- c'est que le choix à été automatique dans 99% des cas.
-- Par conséquent, ça veux dire que l'adresse mail existe
déjà et est déjà activée.
-- On va donc pas chercher à envoyer un mail au contact pour
qu'il active son mail mais
-- pour valider l'ajout de l'adresse mail. Pour ça, on va
éxécuter un script PHP
-- similaire à celui de l'action du mail (même fichier PHP,
mais pas même action)
PERFORM clients."php-maj-contact"(v_id, 'nv', p_nom,
p_email);
-- nv = Nouveau
END IF;
END IF;
RETURN v_id;
END;
$contact$ language plpgsql;
-----------------------


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: RETURN cannot have a parameter in function with OUT parameters
Date: 2008-09-02 11:52:48
Message-ID: 48BD2910.5000904@lelarge.info
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-fr-generale

Samuel ROZE a écrit :
> Bonjour à tous,
>
> Toujours dans mon fonction "contact" de la dernière fois, PostgreSQL me
> sort une erreur bizare avec une simple fonction plpgsql...
>
> "5-clients-fonctions.sql:36: ERREUR: RETURN cannot have a parameter in
> function with OUT parameters sur ou près de « v_id » at character 1486"
>
> Je ne comprend vraiment pas qu'est-ce qu'il ce passe... Pouvez-vous
> m'aider ? Ci-dessous la fonction concernée.
>
> -----------------------
> CREATE OR REPLACE FUNCTION clients.contact (p_nom text, p_email text,
> inout TRIGGER integer) RETURNS integer AS $contact$

Tu déclares ta fonction comme renvoyant un integer, non pas grâce à la
clause returns, mais avec le mode inout du paramètre trigger (fort
mauvais nom pour une variable car trigger est un mot clé réservé).

> [...]
> RETURN v_id;

Du coup, ici, tu ne dois pas avoir

RETURN une_variable;

mais

RETURN;

et la valeur actuelle de la variable TRIGGER sera renvoyée.

Bref, vu ton code (et surtout vu ce que tu veux renvoyer), je pense que
le mode inout est à supprimer.

--
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: RETURN cannot have a parameter in function with OUT parameters
Date: 2008-09-02 11:54:51
Message-ID: 1220356491.7881.3.camel@samuel-laptop
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-fr-generale

Le mode "inout" m'as été conseillé enfin du moins m'as été proposer dans
cette même liste de discussion...

C'est donc une mauvaise idée ? Je vais revenir à l'ancienne méthode :)

Merci.

Le mardi 02 septembre 2008 à 13:52 +0200, Guillaume Lelarge a écrit :
> Samuel ROZE a écrit :
> > Bonjour à tous,
> >
> > Toujours dans mon fonction "contact" de la dernière fois, PostgreSQL me
> > sort une erreur bizare avec une simple fonction plpgsql...
> >
> > "5-clients-fonctions.sql:36: ERREUR: RETURN cannot have a parameter in
> > function with OUT parameters sur ou près de « v_id » at character 1486"
> >
> > Je ne comprend vraiment pas qu'est-ce qu'il ce passe... Pouvez-vous
> > m'aider ? Ci-dessous la fonction concernée.
> >
> > -----------------------
> > CREATE OR REPLACE FUNCTION clients.contact (p_nom text, p_email text,
> > inout TRIGGER integer) RETURNS integer AS $contact$
>
> Tu déclares ta fonction comme renvoyant un integer, non pas grâce à la
> clause returns, mais avec le mode inout du paramètre trigger (fort
> mauvais nom pour une variable car trigger est un mot clé réservé).
>
> > [...]
> > RETURN v_id;
>
> Du coup, ici, tu ne dois pas avoir
>
> RETURN une_variable;
>
> mais
>
> RETURN;
>
> et la valeur actuelle de la variable TRIGGER sera renvoyée.
>
> Bref, vu ton code (et surtout vu ce que tu veux renvoyer), je pense que
> le mode inout est à supprimer.
>
>


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: RETURN cannot have a parameter in function with OUT parameters
Date: 2008-09-02 11:57:52
Message-ID: 48BD2A40.5060801@lelarge.info
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-fr-generale

Samuel ROZE a écrit :
> Le mode "inout" m'as été conseillé enfin du moins m'as été proposer dans
> cette même liste de discussion...
>
> C'est donc une mauvaise idée ? Je vais revenir à l'ancienne méthode :)
>

C'est pas forcément une mauvaise idée. Là, dans ce cas, je ne vois pas
l'intérêt.

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


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: RETURN cannot have a parameter in function with OUT parameters
Date: 2008-09-02 12:24:28
Message-ID: 48BD307C.3050405@kryskool.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-fr-generale

Bonjour

Samuel ROZE a écrit :
> Le mode "inout" m'as été conseillé enfin du moins m'as été proposer dans
> cette même liste de discussion...
>
> C'est donc une mauvaise idée ? Je vais revenir à l'ancienne méthode :)
>
> Merci.
>

Voila comment je combine RETURN et INOUT, INOUT je m'en sert pour
alimenter mes variables, quand a RETURN, sa valeur je m'en sert pour
information si le traitement de la fonction s'est bien passé.

Donc dans mon cas 2 utilisations différentes,

Cordialement,

Christophe Chauvet


From: Guillaume Lelarge <guillaume(at)lelarge(dot)info>
To: christophe(at)kryskool(dot)org
Cc: Samuel ROZE <samuel(dot)roze(at)aliceadsl(dot)fr>, pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: RETURN cannot have a parameter in function with OUT parameters
Date: 2008-09-02 12:37:56
Message-ID: 48BD33A4.2090507@lelarge.info
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-fr-generale

Christophe Chauvet a écrit :
> [...]
> Samuel ROZE a écrit :
>> Le mode "inout" m'as été conseillé enfin du moins m'as été proposer dans
>> cette même liste de discussion...
>>
>> C'est donc une mauvaise idée ? Je vais revenir à l'ancienne méthode :)
>> Merci.
>>
>
> Voila comment je combine RETURN et INOUT, INOUT je m'en sert pour
> alimenter mes variables, quand a RETURN, sa valeur je m'en sert pour
> information si le traitement de la fonction s'est bien passé.
>
> Donc dans mon cas 2 utilisations différentes,
>

Quelle version de PostgreSQL ?
Tu peux nous montrer ta fonction ?

Parce que, moi, en 8.3.3, j'ai ceci:

glmf=# create or replace function f (inout p1 integer) returns integer
glmf-# language plpgsql
glmf-# as $$
glmf$# begin
glmf$# return 2;
glmf$# end;
glmf$# $$;
ERREUR: RETURN cannot have a parameter in function with OUT parameters
sur ou près de « 2 »
LIGNE 5 : return 2;

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


From: Christophe Chauvet <christophe(at)kryskool(dot)org>
To: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: RETURN cannot have a parameter in function with OUT parameters
Date: 2008-09-02 14:07:57
Message-ID: 48BD48BD.5000905@kryskool.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-fr-generale

Guillaume Lelarge a écrit :
> Quelle version de PostgreSQL ?
> Tu peux nous montrer ta fonction ?
>
Autant pour moi, c'est sous Oracle que c'est possible :( ,
effectivement PostgreSQL ne gère pas cette possibilité.

Christophe.
P.S. j'avais oublié de mettre la liste en copie :)


From: Guillaume Lelarge <guillaume(at)lelarge(dot)info>
To: christophe(at)kryskool(dot)org
Cc: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: RETURN cannot have a parameter in function with OUT parameters
Date: 2008-09-02 14:20:48
Message-ID: 48BD4BC0.9020901@lelarge.info
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-fr-generale

Christophe Chauvet a écrit :
> Guillaume Lelarge a écrit :
>> Quelle version de PostgreSQL ?
>> Tu peux nous montrer ta fonction ?
>>
> Autant pour moi, c'est sous Oracle que c'est possible :( ,
> effectivement PostgreSQL ne gère pas cette possibilité.
>

Pour une fois que c'est à mon avantage de ne pas connaître Oracle :)

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