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

PostgreSQL returnerer en funktion med en brugerdefineret datatype

Det her burde bare virke. enum burde ikke være et problem. Testet med Postgres 9.1 og 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);

Undtagen ...

  • I versioner før 9.2 du kan kun bruge positionelle (numeriske) parametre ($1 ) i SQL-funktioner (i modsætning til plpgsql-funktioner).
    I 9.2+ kolonnenavnet ville have forrang, så WHERE klausul i din oprindelige kode vil altid være TRUE, og alle rækker ville kvalificere sig - bortset fra at din funktion kun returnerer den første, da den ikke returnerer en SETOF building_code .
    Enten omdøb din parameter eller brug positionsparameter eller helst begge dele.
    Hvis du skal bruge modstridende parameternavne, kan du tilsidesætte præferencen ved at bruge funktionsnavnet til at kvalificere parameteren. Ligesom:

    ... WHERE v.id = room_code.id
    
  • Du bør ikke bruge typenavnet som kolonnenavn.

  • Du bør ikke bruge navne med blandede store og små bogstaver uden anførselstegn som roomCode , som vil blive foldet til små bogstaver, medmindre du dobbeltciterer:"roomCode" .

->SQLfiddle med 3 varianter




  1. Sådan konfigureres syntaksfremhævning i SQLcl

  2. TIMESTAMPDIFF() Eksempler – MySQL

  3. Mine foretrukne PostgreSQL-udvidelser - del 1

  4. Implementering af failover i MS SQL Server 2017 Standard