URL: https://linuxfr.org/users/skc/journaux/postgresql-%C3%A9crire-une-fonction-plpgsql Title: PostgreSQL: écrire une fonction plpgsql Authors: Sébastien Koechlin Date: 2003年12月30日T18:33:41+01:00 Tags: debian et postgresql Score: 0 Je me suis bien amusé à écrire une fonction récursive pour récupérer un chemin sous PostgrSQL, je vous en fais profiter. On a : skc=# SELECT id,name,parent FROM dir; .id.|.name.|.parent ---+--------+--------- ..0.|./.........|......0... ..1.|.home.|......0... ..2.|.etc.....|......0... ..3.|.skc.....|......1... (4 rows) Et ça donne : skc=# select get_path(1); -> /home/ skc=# select get_path(3); -> /home/skc/ skc=# select get_path(4); -> ERROR: dir.id 4 not found **Installer plpgsql** Sur ma Debian woody, plpgsql n'était pas déclaré dans la base de donnée, il suffit de lancer /usr/lib/postgresql/bin/createlang [--echo] plpgsql skc pour créer le handler du langage dans la base skc, --echo permet de voir les commandes qui sont effectivement exécutées. **La fonction** CREATE OR REPLACE FUNCTION get_path(INTEGER) RETURNS VARCHAR AS ' DECLARE dir_id ALIAS FOR 1ドル; dir_name VARCHAR; dir_pid INTEGER; BEGIN SELECT INTO dir_name name FROM dir WHERE id=dir_id; IF NOT FOUND THEN RAISE EXCEPTION ''dir.id=% not found'', dir_id; END IF; IF dir_id = 0 THEN RETURN dir_name; ELSE SELECT INTO dir_pid parent FROM dir WHERE id=dir_id; RETURN get_path(dir_pid) || dir_name || ''/''; END IF; END; ' LANGUAGE 'plpgsql'; Voila, si vous voyez comment améliorer la fonction ou si vous avez une fonction équivalente pour une autre base de données, n'hésitez pas à poster un commentaire.