Documentazione di PostgreSQL 9.0 > Programmazione del server > Estendere SQL > Il sistema dei tipi di PostgreSQL
PrecedenteEstendere SQLUser-Defined FunctionsSuccessivo

35.2. Il sistema dei tipi di PostgreSQL

I tipi di dato di PostgreSQL™ sono divisi in tipi di base, tipi composti, domini e pseudo-tipi.

35.2.1. Tipi di base

I tipi di base sono quelli che, come int4, sono implementati sotto il livello del linguaggio SQL (tipicamente in un linguaggio a basso livello tipo il C). Generalmente corrispondono a quelli che spesso sono conosciuti come tipi di dato astratti. PostgreSQL™ può lavorare solo con questi tipi attraverso le funzioni fornite dall'utente e capire solo il comportamento di questi tipi nella misura in cui l'utente li descrive. I tipi di base sono suddivisi in tipi scalari e array. Per ogni tipo scalare, viene creato automaticamente un tipo array corrispondente che può gestire array di dimensione variabile di quel tipo scalare.

35.2.2. Tipi composti

I tipi composti, o tipi riga, vengono creati ogni volta che l'utente crea una tabella. È anche possibile usare CREATE TYPE(7) per definire un tipo composto «a sè stante» senza tabella associata. Un tipo composto è semplicemente un elenco di tipi con nomi di campo associati. Un valore di un tipo composto è una riga o record di valori di campo. L'utente può accedere ai campi "componente" dalle query SQL. Si veda Sezione 8.15, «Composite Types» per maggiori informazioni dui tipi composti.

35.2.3. Domini

Un dominio è basato su un particolare tipo di base e per molti scopi è intercambiabile col suo tipo di base. Comunque, un dominio può avere vincoli che restringono i suoi valori validi a un sottoinsieme di cosa permette il sottostante tipo di base.

I domini possono essere creati usando il comando SQL CREATE DOMAIN(7). La loro creazione ed utilizzo non sono discussi in questo capitolo.

35.2.4. Pseudo-tipi

Ci sono alcuni «pseudo-tipi» per scopi speciali. Gli pseudo-tipi non possono apparire come colonne di tabelle o attributi di tipi composti, ma possono essere usati per dichiarare i tipi degli argomenti e del valore di ritorno delle funzioni. Questo fornisce un meccanismo all'interno del sistema dei tipi per identificare classi di funzioni speciali. Tabella 8.24, «Pseudo-tipi» elenca gli pseudo-tipi esistenti.

35.2.5. Tipi polimorfici

Quattro pseudo-tipi di speciale interesse sono anyelement, anyarray, anynonarray e anyenum, che sono chiamati collettivamente tipi polimorfici. Qualsiasi funzione dichiarata usando questi tipi è definita funzione polimorfica. Una funzione polimorfica può operare su diversi tipi di dato, con lo specifico tipo/i di dato determinato dai tipi di dato effettivamente passati ad essa in una particolare chiamata.

Gli argomenti polimorfici e i risultati sono legati l'uni gli altri e vengono risolti ad uno specifico tipo di dato quando la chiamata di una funzione polimorfica viene sottoposta al parsing. Ogni posizione (o il valore dell'argomento o il valore di ritorno) dichiarata come anyelement può avere qualsiasi tipo di dato, ma in ogni data chiamata devono essere tutti dello stesso tipo effettivo. Ogni posizione dichiarata come anyarray può avere qualsiasi tipo di dato array, ma similmente devono essere tutti dello stesso tipo. Se ci sono posizioni dichiarate anyarray e altre dichiarate anyelement, il tipo array effettivo nelle posizioni anyarray deve essere un array i cui elementi sono dello stesso tipo di quelli che appaiono nelle posizioni anyelement. anynonarray viene trattato esattamente alla stessa maniera di anyelement, ma aggiunge il vincolo che il tipo effettivo non deve essere un tipo array. anyenum viene trattato esattamente allo stesso modo di anyelement, ma aggiunge il vincolo che il tipo effettivo dev'essere un tipo enum.

Perciò, quando più di una posizione argomento viene dichiarata con un tipo polimorfico, l'effetto è che solo certe combinazioni di effettivi tipi sono permesse. Per esempio, una funzione dichiarata come equal(anyelement, anyelement) prenderà qualsiasi due valori di input, se sono dello stesso tipo di dato.

Quando il valore di ritorno di una funzione è dichiarato come un tipo polimorfico, ci deve anche essere almeno una posizione di argomento che è poliformica, e il tipo di dato effettivo fornito come argomento determina l'effettivo tipo del risultato per quella chiamata. Per esempio, se non c'era già un meccanismo di sottoscript dell'array, si potrebbe definire una funzione che implementa il sottoscripting come subscript(anyarray, integer) returns anyelement. Questa dichiarazione vincola l'effettivo primo argomento ad essere un tipo array, e permette che il parser deduca il tipo del risultato dal tipo effettivo del primo argomento. Un altro esempio è che una funzione dichiarata come f(anyarray) returns anyenum accetterà solo array di tipi enum.

Notare che anynonarray e anyenum non rappresentano variabili di tipo separate; sono lo stesso tipo di anyelement, solo con un vincolo aggiuntivo. Per esempio, dichiarando una funzione come f(anyelement, anyenum) è equivalente a dichiararla come f(anyenum, anyenum): entrambi gli effettivi argomenti devono essere dello stesso tipo enum.

Una funzione variadica (che prende un numero variabile di argomenti, come in Sezione 35.4.5, «SQL Functions with Variable Numbers of Arguments») puà essere polimorfica: questo è fatto dichiarando il suo ultimo parametro come VARIADIC anyarray. Per scopi di corrispondenza di argomenti e per determinare l'effettivo tipo del risultati, tale funzione si comporta allo stesso modo se è stata scritta con l'appropriato numero di parametri anynonarray.

Documentazione di PostgreSQL 9.0 > Programmazione del server > Estendere SQL > Il sistema dei tipi di PostgreSQL
PrecedenteEstendere SQLUser-Defined FunctionsSuccessivo