Vous pouvez utiliser le hachage global %_SHARED pour stocker les données, incluant les références de code, entre les appels de fonction pour la durée de vie de la session en cours.
Voici un exemple simple pour des données partagées :
CREATE OR REPLACE FUNCTION set_var(name text, val text) RETURNS text AS $$ if ($_SHARED{$_[0]} = $_[1]) { return 'ok'; } else { return "Ne peux pas initialiser la variable partagée $_[0] à $_[1]"; } $$ LANGUAGE plperl; CREATE OR REPLACE FUNCTION get_var(name text) RETURNS text AS $$ return $_SHARED{$_[0]}; $$ LANGUAGE plperl; SELECT set_var('sample', 'Bonjour, PL/Perl ! Comment va ?'); SELECT get_var('sample');
Voici un exemple légèrement plus compliqué utilisant une référence de code :
CREATE OR REPLACE FUNCTION ma_fonction() RETURNS void AS $$ $_SHARED{myquote} = sub { my $arg = shift; $arg =~ s/(['\\])/\\$1/g; return "'$arg'"; }; $$ LANGUAGE plperl; SELECT ma_fonction(); /* initialise la fonction */ /* Initialise une fonction qui utilise la fonction quote */ CREATE OR REPLACE FUNCTION utilise_quote(TEXT) RETURNS text AS $$ my $text_to_quote = shift; my $qfunc = $_SHARED{myquote}; return &$qfunc($text_to_quote); $$ LANGUAGE plperl;
(Vous pouviez avoir remplacé le code ci-dessus avec la seule ligne return $_SHARED{myquote}->($_[0]); au prix d'une mauvaise lisibilité.)