

   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é.)
  
   Pour des raisons de sécurité, PL/Perl exécute des fonctions appelées par
   un rôle SQL dans un interpréteur Perl séparé pour ce rôle. Ceci empêche
   l'interférence accidentelle ou malicieuse d'un utilisateur avec le
   comportement des fonctions PL/Perl d'un autre utilisateur. Chaque
   interpréteur a sa propre valeur de la variable
   %_SHARED et des autres états globaux. Du coup, deux
   fonctions PL/Perl partageront la même valeur de %_SHARED
   si et seulement si elles sont exécutées par le même rôle SQL. Dans une
   application où une session seule exécute du code sous plusieurs rôles SQL
   (via des fonctions SECURITY DEFINER, l'utilisation de
   SET ROLE, etc), vous pouvez avoir besoin de mettre en place des
   étapes explicites pour vous assurer que les fonctions PL/Perl peuvent
   partager des données %_SHARED. Pour cela, assurez-vous
   que les fonctions qui doivent communiquer ont pour propriétaire le même
   utilisateur et marquez les comme SECURITY DEFINER. Bien sûr,
   vous devez faire attention à ce que ces fonctions ne puissent pas être
   utilisées pour faire des choses qu'elles ne sont pas sensées faire.