Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 21/07/2010 14:10:45
- Tinaby
- Membre
Syntax error sur "CURSOR"
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
#2 21/07/2010 14:23:28
- Marc Cousin
- Membre
Re : Syntax error sur "CURSOR"
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
#3 21/07/2010 14:28:20
- Tinaby
- Membre
Re : Syntax error sur "CURSOR"
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
#4 21/07/2010 14:34:03
- Marc Cousin
- Membre
Re : Syntax error sur "CURSOR"
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
#5 21/07/2010 14:46:21
- Tinaby
- Membre
Re : Syntax error sur "CURSOR"
A vot' service m'sieurs !
Avec le temps que vous passez sur le forum pour nous aider, c'est un minimum
Hors ligne
#6 21/07/2010 15:06:51
- flo
- Membre
Re : Syntax error sur "CURSOR"
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
#7 21/07/2010 15:13:02
- Marc Cousin
- Membre
Re : Syntax error sur "CURSOR"
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
#8 21/07/2010 15:57:19
- flo
- Membre
Re : Syntax error sur "CURSOR"
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
#9 21/07/2010 16:03:51
- Marc Cousin
- Membre
Re : Syntax error sur "CURSOR"
Ah ok. Oui, en 9.0 possible. J'ai testé en 8.4.
Marc.
Hors ligne
#10 21/07/2010 19:32:05
- flo
- Membre
Re : Syntax error sur "CURSOR"
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