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

#1 06/10/2011 12:29:32

guk92
Membre

Deux erreurs détectées dans la documentation

Bonjour,

J'ai remarqué 2 "erreurs" dans la documentation, du moins j'ai cette impression.
Si ce n'est pas le cas, je vous prie de me rectifier.
Tout d'abord la source des informations viennent de la documentation officielle PostgreSQL :
http://www.postgresql.org/docs/9.1/stat … tures.html



Dans les conditions IF/ ELSEIF / ELSE, on peut y lire :
The key word ELSIF can also be spelled ELSEIF. (pour PostgreSQL 9.1)

Dans une version plus ancienne de la documentation, on peut aussi y lire :
ELSEIF is an alias for ELSIF. (pour PostgreSQL 8.2)

Or d'après le Standard SQL, j'ai vu sur developpez.com que le mot-clé ELSEIF fait partit de la norme, tandis que le mot-clé ELSIF n'y figure pas.
C'est donc ELSIF qui devrait être un ALIAS de ELSEIF et pas le contraire.
En tout cas en PL/SQL (Oracle), c'est bien le mot-clé ELSIF qui est employé (mais fait-il parti de la norme ?).






Avec la boucle FOR (c'est la même chose avec toutes les versions PostgreSQL des documentations utilisateur):
FOR i IN 1..10 LOOP
    -- i will take on the values 1,2,3,4,5,6,7,8,9,10 within the loop
END LOOP;

FOR i IN REVERSE 10..1 LOOP
    -- i will take on the values 10,9,8,7,6,5,4,3,2,1 within the loop
END LOOP;

Il y a une incohérence dans la seconde boucle par rapport à un exemple PL/SQL :
The FOR Loop can also loop in reverse. For example:
    FOR Lcntr IN REVERSE 1..15
    LOOP
         -- Statements
    END LOOP;
This example will loop 15 times. The counter will start at 15 and end at 1. (loops backwards)


Donc l'exemple :
FOR i IN REVERSE 10..1 LOOP
    -- i will take on the values 10,9,8,7,6,5,4,3,2,1 within the loop
END LOOP;

Devrait plutôt s'écrire :
FOR i IN REVERSE 1..10 LOOP
    -- i will take on the values 10,9,8,7,6,5,4,3,2,1 within the loop
END LOOP;




Autrement je souhaiterais savoir s'il est possible de déclarer des variables dans une FUNCTION entre le BEGIN et le END, car j'ai essayé et ça n'a pas marché, il m'a semblé avoir vu qu'il était possible de déclarer une variable entre le BEGIN et END dans une FUNCTION dans la documentation.
Est-t-il possible de déclarer une variable autre part qu'entre le FUNCTION() et BEGIN ?



Merci et bonne continuation.

Hors ligne

#2 06/10/2011 12:51:12

gleu
Administrateur

Re : Deux erreurs détectées dans la documentation

1. Ça ne change pas grand-chose. L'implémentation de PostgreSQL fait que l'un est un alias de l'autre. De toute façon, en ce qui concerne le standard SQL, il décrit un langage nommé SQL-PSM qui n'existe pas encore sous PostgreSQL. PL/pgsql s'en rapproche par certains points mais PL/pgsql n'est pas SQL-PSM.

2. Oui, PL/pgsql n'est pas PL/SQL d'Oracle. La documentation n'est pas en erreur.

3. Oui, c'est possible, voir l'exemple ci-dessous :

create or replace function f1() returns boolean language plpgsql as $$
begin
  -- des instructions
  declare
    a text;
  begin
    a := 'toto';
    -- d'autres instructions
  end;
  -- encore des instructions
  return false;
end
$$;

Guillaume.

Hors ligne

#3 06/10/2011 14:05:31

guk92
Membre

Re : Deux erreurs détectées dans la documentation

Je ne connaissais pas le SQL-PSM, j'ai lu un très court article en anglais sur Wikipédia.
Je ne sais pas contre pas lequel je vais utiliser entre en ELSIF ou ELSEIF (je suis pointilleux).



Je confirme pour la 2. après test. Par contre ça prouve que les code PL/pgSQL et PL/SQL ne sont pas portables pour les boucles FOR.
Au faite j'ai essayé de faire un affichage grâce à la commande NOTICE RAISE mais je n'ai pas réussis à afficher quoi que ce soit :

CREATE OR REPLACE FUNCTION p_boucleFor()
RETURNS void AS $$
BEGIN


FOR i IN REVERSE 3..1 LOOP
	NOTICE RAISE 'valeur de i : %', i; 
END LOOP; -- Fin de la boucle FOR


END;
$$ LANGUAGE plpgsql;


SELECT p_boucleFor();

Rien ne s'affiche sous Query, pourquoi ?


Pour les fonctions, je trouve la syntaxe un poil compliqué, car il n'est pas possible de déclarer des variables dans le second BEGIN de ton exemple, du coup je préfère déclarer toutes les variables une seule fois de cette manière :

CREATE [OR REPLACE] FUNCTION nomProcedure()
RETURNS type AS $$
/*  Déclarer toutes les variables ICI  */
BEGIN -- Début de la procédure ou fonction

/* Traitement */

END; -- Fin de la procédure ou fonction
$$ LANGUAGE plpgsql;

C'est dommage car il est possible de déclarer des variables où l'on veut en T-SQL sous SQL Server.



Merci.

Hors ligne

#4 06/10/2011 14:16:42

gleu
Administrateur

Re : Deux erreurs détectées dans la documentation

Par contre ça prouve que les code PL/pgSQL et PL/SQL ne sont pas portables pour les boucles FOR.

Si seulement il n'y avait que les boucles FOR smile

Rien ne s'affiche sous Query, pourquoi ?

Tout d'abord, "NOTICE RAISE" n'existe pas dans PL/pgsql. "RAISE NOTICE", oui. Oui, je suis pointilleux moi-aussi smile

RAISE permet d'envoyer un message dans les logs ou au client, à condition que le log_min_messages (ou le client_min_messages pour le client) soit configuré à un niveau minimum de "NOTICE". Ce qui n'est pas le cas par défaut.


Guillaume.

Hors ligne

#5 06/10/2011 14:16:58

rjuju
Administrateur

Re : Deux erreurs détectées dans la documentation

guk92 a écrit :

FOR i IN REVERSE 3..1 LOOP
    NOTICE RAISE 'valeur de i : %', i;
END LOOP; -- Fin de la boucle FOR


END;
$$ LANGUAGE plpgsql;


SELECT p_boucleFor();
Rien ne s'affiche sous Query, pourquoi ?

Il faut faire un RAISE NOTICE et non un NOTICE RAISE

Hors ligne

#6 06/10/2011 15:58:04

guk92
Membre

Re : Deux erreurs détectées dans la documentation

Veuillez m'excuser pour cette erreur de copier/coller de RAISE NOTICE, le problème persiste toujours :

 DROP FUNCTION p_boucleFor();

CREATE OR REPLACE FUNCTION p_boucleFor()
RETURNS void AS $$
BEGIN


FOR i IN REVERSE 3..1 LOOP
    RAISE NOTICE 'valeur de i : %', i; 
END LOOP; -- Fin de la boucle FOR


END;
$$ LANGUAGE plpgsql;


SELECT p_boucleFor();

Rien ne s'affiche.

Voici le problème en image :
111006040108142354.jpg


Merci

Hors ligne

#7 06/10/2011 16:08:13

rjuju
Administrateur

Re : Deux erreurs détectées dans la documentation

Comme le disait Guillaume, il faut s'assurer que le log_min_message ou le client_min_messages soit à notice.

Sinon dans pgAdmin, les raise s'affichent dans l'onglet "Messages" et non pas dans l'onglet "Sortie de données".

Dernière modification par rjuju (06/10/2011 16:12:53)

Hors ligne

#8 06/10/2011 16:26:53

gleu
Administrateur

Re : Deux erreurs détectées dans la documentation

Juste pour infos, l'onglet "Sortie de données" n'affiche évidemment que les données.


Guillaume.

Hors ligne

#9 06/10/2011 16:48:01

guk92
Membre

Re : Deux erreurs détectées dans la documentation

Les messages s'affichent bien dans l'onglet "Messages".

Je vous remercie pour vos réponses.

Hors ligne

#10 10/10/2011 15:19:06

SQLpro
Membre

Re : Deux erreurs détectées dans la documentation

guk92 a écrit :

Veuillez m'excuser pour cette erreur de copier/coller de RAISE NOTICE, le problème persiste toujours :

Pour une explication détaillée, lire :
http://blog.developpez.com/sqlpro/p1006 … fonctions/
Notamment § 9 - GESTION D'ERREUR

Cet article compare les implémentations d'UDF sous PostGreSQL et MS SQL Server.

Anecdote : d'après ce forum, personne ne s'intéresse aux comparaisons entre SQL Server et PostGreSQL, votre demande est un réel démenti....

A +


Frédéric Brouard, alias SQLpro,  ARCHITECTE DE DONNÉES,  Expert langage SQL
Le site sur les SGBD relationnel et langage SQL   : http://sqlpro.developpez.com/
Modélisation de données, conseil, expertise, audit, optimisation, tuning, formation
* * * * *  Enseignant CNAM PACA, ISEN Toulon,  CESI Aix en Provence  * * * * *

Hors ligne

#11 10/10/2011 20:29:11

guk92
Membre

Re : Deux erreurs détectées dans la documentation

Bonsoir SQLpro,
Apprendre des choses sur PostgreSQL et la norme SQL pour une personne comme moi qui vient de SQL Server est une expérience très enrichissante.
D'ailleurs, d'après ce que j'ai vu, vous êtes vous même consultant SQL Server, donc dire que les personnes qui se trouvent sur ce forum ne s'intéresse qu'à PostgreSQL serait faux.

Hors ligne

Pied de page des forums