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
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=>
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.
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.
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 ...