sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL returnerar en funktion med en anpassad datatyp

Det här borde bara fungera. enum borde inte vara ett problem. Testad med Postgres 9.1 och 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);

Utom ...

  • I versioner före 9.2 du kan bara använda positionella (numeriska) parametrar ($1 ) i SQL-funktioner (till skillnad från plpgsql-funktioner).
    I 9.2+ kolumnnamnet skulle ha företräde, så att WHERE satsen i din ursprungliga kod skulle alltid vara TRUE och alla rader skulle kvalificera - förutom att din funktion endast returnerar den första, eftersom den inte returnerar en SETOF building_code .
    Byt antingen namn på din parameter eller använd positionsparameter eller helst båda.
    Om du måste använda motstridiga parameternamn kan du åsidosätta inställningen genom att använda funktionsnamnet för att kvalificera parametern. Gilla:

    ... WHERE v.id = room_code.id
    
  • Du bör inte använda typnamnet som kolumnnamn.

  • Du bör inte använda blandade skiftlägesnamn utan citationstecken som roomCode , som kommer att vikas till gemener, om du inte dubbelciterar:"roomCode" .

->SQLfiddle med 3 varianter




  1. Kommaseparerade värden till IN-funktion i oracle

  2. Hur funktionen OCTET_LENGTH() fungerar i MySQL

  3. Har du problem med MS Access Crashing? Prova dessa lösningar först

  4. Ta dumpning av bord i oracle 10g med PL/SQL-proceduren