2ndQuadrant » named parameters https://blog.2ndquadrant.it Il blog sui database di 2ndQuadrant Italia Thu, 25 Jan 2018 11:36:59 +0000 en-US hourly 1 http://wordpress.org/?v=4.3.15 PostgreSQL 9.2: parametri denominati in funzioni SQL https://blog.2ndquadrant.it/postgres9-2-parametri-denominati-in-funzioni-sql/ https://blog.2ndquadrant.it/postgres9-2-parametri-denominati-in-funzioni-sql/#comments Mon, 06 Aug 2012 08:00:01 +0000 http://blog.2ndquadrant.it/?p=1213 Come sviluppatori e amministratori di database pensiamo che PostgreSQL non debba essere visto come un semplice contenitore di dati. Amiamo portare la logica dentro al database e PostgreSQL offre molti linguaggi procedurali per farlo.

A volte scrivere le funzioni in SQL è molto utile. SQL è più semplice rispetto ai linguaggi procedurali, ha meno richieste in termini di memoria e risulta molto più veloce.

Noi di 2ndQuadrant Italia utilizziamo un approccio agile e collaborativo alla programmazione, questo implica che diverse persone all’interno del team debbano mettere le mani sullo stesso codice, anche a settimane di distanza. Per questo sentiamo la necessità di scrivere codice che sia chiaro e leggibile.

In PostgreSQL 9.2 la scrittura di funzioni in SQL è stata resa più facile aggiungendo la possibilità di usare parametri denominati (in inglese named parameter).

Prima della 9.2 era necessario utilizzare $1 per riferirsi al primo parametro della funzione, $2 per il secondo, e così via.

Questo ha sempre creato grossi problemi in termini di manutenibilità del codice.

Un esempio di utilizzo degli argomenti denominati è descritto di seguito, tramite la definizione di una funzione SQL che controlla il valore di md5sum rispetto a due file, restituendo TRUE in caso sia uguale, FALSE altrimenti.

Tenete presente che i file devono risiedere sul server e il percorso dei file deve essere relativo alla directory PGDATA di PostgreSQL (per motivi di sicurezza).

BEGIN;
CREATE OR REPLACE FUNCTION check_md5( _file1 TEXT, _file2 TEXT )
   RETURNS BOOLEAN LANGUAGE SQL immutable AS
$BODY$

SELECT CASE WHEN md5(pg_read_binary_file( _file1 )) = md5(pg_read_binary_file( _file2 ))
   THEN TRUE ELSE FALSE END;
$BODY$;

SELECT check_md5('../img/a.jpg','../img/b.jpg');
SELECT check_md5('../img/a.jpg','../img/c.jpg');
SELECT check_md5(NULL,'../img/c.jpg');
ROLLBACK;

Questa nuova funzionalità renderà molto più leggibile e manutenibile il codice, e per noi non può che essere un’ottima notizia!

]]>
https://blog.2ndquadrant.it/postgres9-2-parametri-denominati-in-funzioni-sql/feed/ 0