37.2. Accès à la base de données depuis PL/Perl

L'accès à la base de données à l'intérieur de vos fonctions écrites en Perl peut se faire à partir de la fonction spi_exec_query décrite ci-dessous ou à partir du module expérimental DBD::PgSPI (aussi disponible sur un miroir du CPAN). Ce module rend accessible un descripteur de base de données conforme à DBI nommé $pg_dbh qui peut être utilisé pour exécuter des requêtes en utilisant la syntaxe habituelle de DBI.

Actuellement, PL/Perl fournit deux commandes Perl supplémentaires :

spi_exec_query (query [, max-rows])
spi_exec_query( command)

Exécute une commande SQL. Voici un exemple d'une requête (commande SELECT) avec le nombre maximum optionnel de lignes 

         $rv = spi_exec_query('SELECT * FROM ma_table', 5);
       

Ceci envoie cinq lignes au maximum de la table ma_table. Si ma_table a une colonne ma_colonne, vous obtenez la valeur de la ligne $i du résultat de cette façon :

         $foo = $rv->{rows}[$i]->{ma_colonne};
       

Le nombre total des lignes renvoyées d'une requête SELECT peut être accédé de cette façon :

         $nrows = $rv->{processed}
       

Voici un exemple en utilisant un type de commande différent :

         $query = "INSERT INTO ma_table VALUES (1, 'test')";
         $rv = spi_exec_query($query);
       

Ensuite, vous pouvez accéder au statut de la commande (c'est-à-dire, SPI_OK_INSERT) de cette façon :

         $res = $rv->{status};
       

Pour obtenir le nombre de lignes affectées, exécutez :

         $nrows = $rv->{processed};
       

Voici un exemple complet :

         CREATE TABLE test (
         i int,
         v varchar
         );
         
         INSERT INTO test (i, v) VALUES (1, 'première ligne');
         INSERT INTO test (i, v) VALUES (2, 'deuxième ligne');
         INSERT INTO test (i, v) VALUES (3, 'troisième ligne');
         INSERT INTO test (i, v) VALUES (4, 'immortel');
         
         CREATE FUNCTION test_munge() RETURNS SETOF test AS $$
         my $res = [];
         my $rv = spi_exec_query('select i, v from test;');
         my $status = $rv->{status};
         my $nrows = $rv->{processed};
         foreach my $rn (0 .. $nrows - 1) {
         my $row = $rv->{rows}[$rn];
         $row->{i} += 200 if defined($row->{i});
         $row->{v} =~ tr/A-Za-z/a-zA-Z/ if (defined($row->{v}));
         push @$res, $row;
         }
         return $res;
         $$ LANGUAGE plperl;
         
         SELECT * FROM test_munge();
       

elog(level, msg)

Produit un message de trace ou d'erreur. Les niveaux possibles sont DEBUG, LOG, INFO, NOTICE, WARNING et ERROR. ERROR lève une condition d'erreur ; si elle n'est pas récupérée par le code Perl l'entourant, l'erreur se propage à l'extérieur de la requête appelante, causant l'annulation de la transaction ou sous-transaction en cours. Ceci est en fait identique à la commande die de Perl. Les autres niveaux génèrent seulement des messages de niveaux de priorité différents. Le fait que les messages d'un niveau de priorité particulier soient rapportés au client, écrit dans les journaux du serveur, voire les deux, est contrôlé par les variables de configuration log_min_messages et client_min_messages. Voir le Section 16.4 pour plus d'informations.