PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL restituisce una funzione con un tipo di dati personalizzato

Questo dovrebbe funzionare. Il enum Non dovrebbe essere un problema. Testato con Postgres 9.1 e 9.2

CREATE TYPE building_code AS ENUM ('IT','EMS','HSB','ENG');
CREATE TEMP TABLE venue (id int PRIMARY KEY, building_code building_code);
INSERT INTO venue VALUES (1, 'ENG');

CREATE OR REPLACE FUNCTION room_code(_id int) --!
  RETURNS building_code AS 
$func$
SELECT building_code FROM venue v WHERE v.id = $1 -- !
$func$ LANGUAGE SQL;

SELECT * FROM room_code(1);

Tranne ...

  • Nelle versioni prima della 9.2 puoi utilizzare solo parametri posizionali (numerici) ($1 ) nelle funzioni SQL (a differenza delle funzioni plpgsql).
    In 9.2+ il nome della colonna avrebbe la precedenza, in modo che WHERE la clausola del tuo codice originale sarebbe sempre TRUE e tutte le righe si qualificherebbero, tranne per il fatto che la tua funzione restituisce solo la prima, poiché non restituisce un SETOF building_code .
    Rinomina il parametro o utilizza il parametro posizionale o, preferibilmente, entrambi.
    Se devi utilizzare nomi di parametri in conflitto, puoi ignorare la preferenza utilizzando il nome della funzione per qualificare il parametro. Come:

    ... WHERE v.id = room_code.id
    
  • Non dovresti usare il nome del tipo come nome della colonna.

  • Non dovresti usare nomi di casi misti senza virgolette come roomCode , che verrà piegato in minuscolo, a meno che tu non citi due volte:"roomCode" .

->SQLfiddle con 3 varianti