37.2. Astuces pour Développer en PL/pgSQL

Un bon moyen de développer en PL/pgSQL est d'utiliser l'éditeur de texte de votre choix pour créer vos fonctions, et d'utiliser psql dans une autre fenêtre pour charger et tester ces fonctions. Si vous procédez ainsi, une bonne idée est d'écrire la fonction en utilisant CREATE OR REPLACE FUNCTION. De cette façon vous pouvez recharger le fichier seulement pour mettre à jour la définition de la fonction. Par exemple :

CREATE OR REPLACE FUNCTION testfunc(integer) RETURNS integer AS '
	  ....
end;
' LANGUAGE plpgsql;

Pendant que psql tourne, vous pouvez charger ou recharger de telles définitions de fonction avec

\i nom_fichier.sql

et alors immédiatement soumettre des commandes SQL pour tester la fonction.

Un autre bon moyen de développer en PL/pgSQL est d'utiliser un outil d'accès à la base de données muni d'une interface graphique qui facilite le développement dans un langage de procédures. Un exemple d'un tel outil est PgAccess, bien que d'autres existent. Ces outils fournissent souvent des fonctionnalités pratiques telles que la détection des guillemets ouverts et facilitent la re-création et le débogage des fonctions.

37.2.1. Utilisation des guillemets simples (quotes)

Puisque le code d'une fonction PL/pgSQL est spécifié dans la commande CREATE FUNCTION comme une chaîne de caractèreas, chaque guillemet simple (quote) à l'intérieur de la fonction doit être précédé d'un autre guillemet simple (caractère d'échappeemnt). Ceci peut conduire parfois à un code assez compliqué, surtout si vous écrivez une fonction générant d'autres fonctions comme dans l'exemple Section 37.6.4. Ce tableau peut être utile comme résumé du nombre de quotes nécessaire dans diverses situations.

1 guillemet simple

Pour commencer et terminer le corps de la fonction, par exemple :

CREATE FUNCTION foo() RETURNS integer AS '...'
    LANGUAGE plpgsql;

Partout au sein du corps de la fonction, les guillemets simplesdoivent aller par paires.

2 guillemets simples

Pour les chaînes de caractères à l'intérieur du corps de la fonction, par exemple :

a_output := ''Blah'';
SELECT * FROM users WHERE f_name=''foobar'';

4 guillemets simples

Quand vous avez besoin d'un guillemet simple dans une chaîne constante à l'intérieur du corps de la fonction , par exemple :

a_output := a_output || '' AND name LIKE ''''foobar'''' AND xyz''

La valeur effectivement concaténée à a_output est : AND name LIKE 'foobar' AND xyz.

6 guillemets simples

Quand un simple guillemet dans une chaîne à l'intérieur du corps d'une fonction est adjacent à la fin de cette chaîne constante, par exemple :

a_output := a_output || '' AND name LIKE ''''foobar''''''

La valeur effectivement concaténée à a_output est alors : AND name LIKE 'foobar'.

10 guillemets simples

Lorsque vous voulez 2 guillemets simples dans une chaîne constante (qui compte pour 8 guillemets simples) et qu'elle est adjacente à la fin de cette chaîne constante (2 de plus). Vous n'aurez probablement besoin de ceci que si vous écrivez une fonction qui génère d'autres fonctions. Par exemple :

a_output := a_output || '' if v_'' || 
    referrer_keys.kind || '' like '''''''''' 
    || referrer_keys.key_string || '''''''''' 
    then return ''''''  || referrer_keys.referrer_type 
    || ''''''; end if;''; 

La valeur de a_output sera alors :

if v_... like ''...'' then return ''...''; end if;

Une approche différente est d'échapper les guillemets du corps de la fonction avec un antislash plutôt qu'en les doublant. Avec cette méthode, vous vous verrez écrire des choses telles que \'\' au lieu de ''''. Certains trouveront ceci plus lisible, d'autres non.