Ludovic ROLAND

Blog technique sur mes expériences de développeur.

Interagir avec une base de données en Perl 5 grâce au module DBI (5/7) : TP - Simulation de la commande "describe table"

6 août 2022

Je vous propose d’ores et déjà un petit exercice qui va nous permettre de réviser les notions vues au cours des chapitres précédents, mais qui va également nous permettre de voir de nouvelles fonctions qui pourront s’avérer utiles dans vos futurs programmes. ;)

Plan

L’énoncé

Le but de ce TP est simple : faire un script Perl qui permette de simuler la commande SQL.

DESCRIBE VENTE;

Bien entendu, notre commande sera bien plus simplifiée et se contentera d’afficher :

  • le nom des champs ;
  • le type des champs ;
  • si le champ peut être NULL ou non.

Voici un aperçu de ce que devra faire votre script :

> perl describe_vente.pl
------------------------------------------------
|       Champ      |     Type      |    Null   |
------------------------------------------------
|    numVoiture    |    integer    |    non    |
|    numVendeur    |    integer    |    non    |
|    prixReel      |    decimal    |    non    |
|    dateVente     |    date       |    non    |
------------------------------------------------

Une petite aide

Bien évidemment, vous n’avez pas à l’heure actuelle tous les outils pour pouvoir réaliser ce TP. C’est pourquoi je vais vous décrire quelques fonctions qui vous seront sans aucun doute indispensables pour mener à bien ce petit exercice.

La méthode NAME

Cette méthode retourne une référence vers un tableau de noms de colonnes et s’utilise de la manière suivante :

$prep->{'NAME'};

La méthode TYPE

Cette méthode retourne une référence vers un tableau de types de colonnes. Les valeurs possibles sont :

  • 1 si la colonne est de type Char ;
  • 2 si la colonne est de type Numeric ;
  • 3 si la colonne est de type Decimal ;
  • 4 si la colonne est de type Integer ;
  • 5 si la colonne est de type Smallint ;
  • 6 si la colonne est de type Float ;
  • 7 si la colonne est de type Real ;
  • 8 si la colonne est de type Double ;
  • 9 si la colonne est de type Date ;
  • 10 si la colonne est de type Time ;
  • 11 si la colonne est de type Timestamp ;
  • 12 si la colonne est de type Varchar ;
  • -1 si la colonne est de type Longvarchar ;
  • -2 si la colonne est de type Binary ;
  • -3 si la colonne est de type Varbinary ;
  • -4 si la colonne est de type Longvarbinary ;
  • -5 si la colonne est de type Bigint ;
  • -6 si la colonne est de type Tinyint ;
  • -7 si la colonne est de type Bit ;
  • -8 si la colonne est de type Wchar ;
  • -9 si la colonne est de type Wvarchar ;
  • -10 si la colonne est de type Wlongvarchar.

Elle s’utilise de la manière suivante :

$prep->{'TYPE'};

La méthode NULLABLE

Cette méthode retourne une référence vers un tableau de valeurs qui indiquent si les colonnes peuvent être NULL ou non. Les valeurs possibles sont :

une chaine vide si la colonne ne peut pas être NULL ;

  • 1 si la colonne peut être NULL ;
  • 2 si l’état est inconnu.

Elle s’utilise de la manière suivante :

$prep->{'NULLABLE'};

Une solution

Je vous fais part de ma solution. Bien évidemment, il ne s’agit pas de LA solution !

#!/usr/bin/perl

use strict;
use Switch;
use DBI;

#On prépare la connexion
my $base    =   'Zvoitures';
my $hote    =   '127.0.0.1';
my $login   =   'root';
my $mdp     =   '';

#On se connecte
my $dbd = DBI->connect("dbi:mysql:dbname=$base;host=$hote;",$login, $mdp)
    or die 'Connexion impossible à la base de données : '.DBI::errstr;

#On prépare la requête et on l'exécute
my $requete = 'SELECT * FROM VENTE';

my $prep = $dbd->prepare($requete)
    or die 'Impossible de préparer la requête : '.$dbd->errstr;

$prep->execute
    or die 'Impossible d\'exécuter la requête : '.$prep->errstr;

#On récupère les noms des colonnes
my $name = $prep->{'NAME'};

#On récupère les types des colonnes
my $type = $prep->{'TYPE'};

#On regarde si c'est null ou pas
my $null = $prep->{'NULLABLE'};

#On initialise le compteur
my $i = 0;

#On affiche l'en-tête du tableau
print "-----------------------------------------------------------------\n";
print "|\tChamp\t\t|\tType\t\t|\tNull\t|\n";
print "-----------------------------------------------------------------\n";

foreach my $elt (@$name) {
    #On affiche les noms
    print "|\t" . $$name[$i] . "\t|\t";

    #OU
    #print "|\t" . $elt . "\t|\t";

    #On affiche les types
    switch ($$type[$i]) {
        case 1   { print 'char' }
    case 2   { print 'numeric' }
    case 3   { print 'decimal' }
    case 4   { print 'integer' }
    case 5   { print 'smallint' }
    #...
    case -10 { print 'Wlongvarchar' } 
    }
    
    print "\t\t|\t";

    #On affiche si c'est NULL ou pas
    if($$null[$i] == 1) {
        print 'oui';
    }
    else {
        print 'non';
    }

    print "\t|\n";
    $i++;
}

#Fin de tableau
print "-----------------------------------------------------------------\n";

#On libère la mémoire et on se déconnecte
$prep->finish;
$dbd->disconnect;

Si vous avez des problèmes, des doutes ou des questions, je vous encourage fortement à les poser sur le forum de ce site !

Quelques améliorations possibles

Pour améliorer ce petit programme, vous pouvez par exemple :

  • faire passer la table à décrire en paramètre du script ;
  • l’enrichir avec plus de détails, il existe de nombreuses autres fonctions que vous trouverez par exemple ici.

La pause est finie, il est temps de reprendre le cours normal du tuto ! ^^

Commentaires