Guide de programmation en PL/PgSQL

PostgreSQL est, sans le moindre doute, la plus aboutie et la plus puissante des base de données libres existantes. En plus de proposer une version avancée de SQL, PostgreSQL propose également un langage de programmation assez proche du PL/SQL d'Oracle : le PL/PgSQL

PL/PgSQL n'est pas activé par défaut, il convient d'utiliser l'utilitaire createlang pour activer cette capacité au niveau d'une database :

$ createlang plpgsql database

Hello World

create function st_hello()
	returns text
	as 'DECLARE
		returned_value text;
	BEGIN
		returned_value := ''Hello World'';
		return returned_value;
	END;'

LANGUAGE 'plpgsql';
Ce code une fois exécuté donnera la valeur suivante~:
elair=> select st_hello();
  st_hello   
-------------
 Hello World
(1 row)

elair=> 

Remplir une condition

drop function test(text);

create function test(text)
	returns int
	as 'DECLARE
		a_value alias for $1;
		v_returned_value int;
	BEGIN
		if a_value = ''good'' then
			v_returned_value := 1;
		else
			v_returned_value := NULL;
		end if;

		return v_returned_value;
	END;'

language 'plpgsql';

Notons l'opérateur de comparaison d'égalité qui est composé d'un seul signe égal et l'opérateur d'attribution qui est formé de deux points suivi d'un signe égal.

La valeur $1 correspond au premier argument passé à la fonction. Cette valeur n'est pas modifiable une fois qu'elle est attribuée, pour lui appliquer un traitement, il peut être nécessaire d'attribuer à une variable défini comme tel (contrairement à un alias qui n'est pas variable) la valeur de l'option.

Notez les emplacements des points virgules.

Operation sur une chaine de charactères

create function chop(text)
        returns text
        as 'declare
                input_char alias for $1;
                length_input integer;
                return_value text;
        BEGIN

                length_input := length(input_char);
                return_value := substr(input_char,1,length_input - 1);

                return return_value;
        END;'
language 'plpgsql';

La fonction chop(text) donnée ci-dessus retourne la chaîne donnée en argument en ayant supprimé son dernier élément. Notez l'utilisation de la fonction length(text) qui retourne la longueur de la variable passée en argument et substr(text,numeric,numeric) qui retourne la chaîne passée en option moins la longueur donnée en deuxième argument à la position donnée en troisième.

Cette fonction ré-implémente sous équivalent sous Perl.

Boucle


create function intr(text,text)
        returns numeric
        as 'DECLARE
                a_sep alias for $1;
                a_string alias for $2;
                v_pos integer;
                v_tmp text;
        BEGIN

                v_pos := 1;
                while v_pos < length(a_string) loop
                        select into v_tmp substr(a_string,v_pos,1);
                        if v_tmp = a_sep then
                                return v_pos;
                        end if;
                        v_pos := v_pos + 1;
                end loop;
                return -1;
        END;'
language 'plpgsql';


La fonction ci-dessus recherche dans une chaîne (premier argument) le charactère passé en second argument. À chaque itération, la boucle vérifie que la variable v_pos n'a pas dépassé la longueur de la chaîne à vérifier, si c'est le le cas, elle sort et retourne -1, ce qui signifie l'échec de la recherche.

A SUiVRE ...