jeudi 23 août 2012

Postgresql - Méthodes de classes

J'ai lu avec intérêt aujourd'hui un article décrivant Postgres en tant que système de base de données relationnelle-objet. Était évoquée notamment une fonctionnalité que je ne connaissais pas: une fonction sur une table peut être appelée directement sur la table via un '.' au lieu d'avoir à utiliser l'appel usuel avec parenthèses. Démonstration:

create table resultats(
 equipe text not null,
 victoires integer not null,
 nuls integer not null,
 defaites integer not null);

insert into resultats values('Troyes', 3, 0, 1);
insert into resultats values('Sète', 1, 2, 0);

create function total(resultats) returns integer as
$$
 select $1.victoires + $1.nuls + $1.defaites;
$$ language sql;

create function points(resultats) returns integer as
$$
 select $1.victoires * 3 + $1.nuls * 2 + $1.defaites;
$$ language sql;

Si l'on veut visualiser le nombre total de matchs et les points de chaque équipe, l'on peut utiliser la requête suivante:

select r.equipe, total(r), points(r) from resultats r;

Mais il est également possible de l'écrire comme ça:

select r.equipe, r.total, r.points from resultats r;

En dehors de l'aspect purement syntactique de la chose, c'est aussi une manière de considérer les fonctions total et points comme étant des méthodes sur la classe resultats.

Aucun commentaire: