Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
j'ai un soucis au niveau d'une fonction. En effet, Postgres me renvoi une erreur de syntaxe au niveau de la déclaration du "cursor", et ce qu'il soit au début où à la fin de mon DECLARE (j'en déduis donc que c'est bien lui le problème).
A priori la seule chose notable que j'ai faite était d'ajouter le plpgsql aux languages de ma base. Ai-je oublié quelque chose ?
Voici la déclaration de la fonction et de ses variables :
CREATE OR REPLACE FUNCTION ma_fonction (var integer) RETURNS void AS $$
DECLARE
var1 integer;
var2 integer;
var3 integer;
CURSOR curseur IS
SELECT champ FROM table
ORDER BY champ;
BEGIN
...
END ma_fonction;
$$ language plpgsql
J'ai la même erreur avec :
CREATE OR REPLACE FUNCTION ma_fonction (var integer) RETURNS void AS $$
DECLARE
CURSOR curseur IS
SELECT champ FROM table
ORDER BY champ;
var1 integer;
var2 integer;
var3 integer;
BEGIN
...
END ma_fonction;
$$ language plpgsql
Je précise que la fonction est créée dans un script shell sous la forme :
psql ma_base << %
[plpgsql]
%
Merci d'avance !
Hors ligne
la syntaxe de déclaration d'une variable c'est
variable type
Quand vous écrivez
CURSOR curseur, c'est donc à l'envers, la syntaxe est
curseur CURSOR
Marc.
Hors ligne
Ah bah ui, mais forcément si y a des pièges dans la doc !
http://docs.postgresqlfr.org/8.4/plpgsql-porting.html
-->
CREATE OR REPLACE FUNCTION cs_update_referrer_type_proc() RETURNS void AS $func$
DECLARE
CURSOR referrer_keys IS
SELECT * FROM cs_referrer_keys
ORDER BY try_order;
func_body text;
func_cmd text;
BEGIN
Ceci dit, ça marche, merci beaucoup ^^
Hors ligne
Wow. Et c'est même faux dans la version originale! Bon, on n'a plus qu'à soumettre un patch.
Merci de l'avoir relevé, soit dit en passant.
Dernière modification par Marc Cousin (21/07/2010 14:34:21)
Marc.
Hors ligne
A vot' service m'sieurs !
Avec le temps que vous passez sur le forum pour nous aider, c'est un minimum
Hors ligne
Il est même bien faux l'exemple (le FOR n'est pas bon non plus). Je l'ai testé et réécrit, mais là je peux pas poster de patch (suis au boulot ).
Tu l'as fait, Marc?
Dernière modification par flo (21/07/2010 15:07:35)
Hors ligne
Le reste du code passe, j'ai réussi à créer la fonction, et la syntaxe du FOR m'a l'air correcte. J'ai déjà posté un patch pour la déclaration du curseur.
Si tu as plus précis sur ce que tu lui reproches…
Marc.
Hors ligne
Ma première tentative :
(j'ai juste remplacé la déclaration du curseur)
CREATE OR REPLACE FUNCTION cs_update_referrer_type_proc() RETURNS void AS $func$
DECLARE
referrer_keys CURSOR IS
SELECT * FROM cs_referrer_keys
ORDER BY try_order;
func_body text;
func_cmd text;
BEGIN
func_body := 'BEGIN' ;
FOR referrer_key IN SELECT * FROM cs_referrer_keys ORDER BY try_order LOOP
func_body := func_body ||
' IF v_' || referrer_key.kind
|| ' LIKE ' || quote_literal(referrer_key.key_string)
|| ' THEN RETURN ' || quote_literal(referrer_key.referrer_type)
|| '; END IF;' ;
END LOOP;
func_body := func_body || ' RETURN NULL; END;';
func_cmd :=
'CREATE OR REPLACE FUNCTION cs_find_referrer_type(v_host varchar,
v_domain varchar,
v_url varchar)
RETURNS varchar AS '
|| quote_literal(func_body)
|| ' LANGUAGE plpgsql;' ;
EXECUTE func_cmd;
END;
$func$ LANGUAGE plpgsql;
Et le message :
ERREUR: la variable d'une boucle sur des lignes doit être une variable de type
RECORD ou ROW, ou encore une liste de variables scalaires
LINE 11: FOR referrer_key IN SELECT * FROM cs_referrer_keys ORDER...
^
Donc j'ai modifié le FOR :
FOR referrer_key IN referrer_keys LOOP
Je vais de ce pas voir ton patch dans l'historique de la mailing-list...
PS : c'est sur une version 9.0 beta 3
Dernière modification par flo (21/07/2010 16:00:08)
Hors ligne
Ah ok. Oui, en 9.0 possible. J'ai testé en 8.4.
Marc.
Hors ligne
Bien, ça y est, j'ai l'explication :
La doc française n'est pas à jour par rapport à la doc anglaise sur l'exemple en question.
Dans la doc française il y a :
FOR referrer_key IN SELECT * FROM cs_referrer_keys ORDER BY try_order LOOP
et dans l'anglaise :
FOR referrer_key IN referrer_keys LOOP
Dernière modification par flo (21/07/2010 20:32:29)
Hors ligne
Pages : 1