Mondi su mondi, sistemi di sistemi.

PostgreSQL 8.4: argomenti delle funzioni

Con la ver­sione 8.4 ven­gono intro­dotte due novità di grande uti­lità: la pos­si­bi­lità di avere un numero varia­bile di argo­menti e la pos­si­bi­lità di spe­ci­fi­care dei valori di default.

Non mi dilungo sul fun­zio­na­mento, piut­to­sto ovvio, riman­dando alla docu­men­ta­zione. Vorrei invece spie­gare il motivo del mio inte­resse, in par­ti­co­lare per le fun­zioni varia­dic.

Funzioni varia­dic

Con que­ste fun­zioni diventa ora sem­pli­cis­simo defi­nirne una gene­rica di inse­ri­mento, uti­liz­za­bile senza che sia quasi neces­sa­rio “mas­sag­giare” i dati che arri­vano da un POST.

Basta creare una fun­zione che abbia come argo­mento VARIADIC text[]. L’array avrà una strut­tura del tipo: nome tabella, chiave, valore, … Usando il pro­prio lin­guag­gio di fidu­cia è facile poi costruire lo sta­te­ment SQL adatto.

Funzioni con default

La pos­si­bi­lità di spe­ci­fi­care dei valori di default può essere molto utile, soprat­tutto con le fun­zioni SQL e non PL/pgSQL, dato che non c’è la pos­si­bi­lità di dichia­rare varia­bili. Tuttavia, più che segna­lare i pos­si­bili usi mi limito a far pre­sente un’ambiguità. 

PostgreSQL (esat­ta­mente come Java) sup­porta l’overloading degli argo­menti: due fun­zioni con lo stesso nome sono disam­bi­guate in base agli argo­menti. Ora, intro­du­cendo i defaults pos­siamo avere situa­zioni come questa:


create or replace function fn (a int)
returns int as $$
    select $1;
$$ language sql;

create or replace function fn (
    a int, b int default 2
) returns int as $$
    select $1 + $2;
$$ language sql;

Se fac­cio: select fn(10, 20) tutto bene, ma con:


test=# select fn(10);
ERROR:  function fn(integer) is not unique
LINE 1: select fn(10);
               ^
HINT:  Could not choose a best candidate function.
You might need to add explicit type casts.
test=#

So che è un caso limite ma è meglio tener pre­sente la cosa.

Per proseguire

Commenti e trackback sono disabilitati.