PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#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 smile

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

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… smile


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

Pied de page des forums