PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL gibt eine Funktion mit einem benutzerdefinierten Datentyp zurück

Das sollte einfach funktionieren. Die enum sollte kein Problem sein. Getestet mit Postgres 9.1 und 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);

Außer ...

  • In Versionen vor 9.2 Sie können nur positionale (numerische) Parameter verwenden ($1 ) in SQL-Funktionen (im Gegensatz zu plpgsql-Funktionen).
    In 9.2+ der Spaltenname würde Vorrang haben, sodass WHERE -Klausel Ihres ursprünglichen Codes wäre immer TRUE und alle Zeilen würden sich qualifizieren - außer dass Ihre Funktion nur die erste zurückgibt, da sie keinen SETOF building_code zurückgibt .
    Benennen Sie entweder Ihren Parameter um oder verwenden Sie Positionsparameter oder vorzugsweise beides.
    Wenn Sie widersprüchliche Parameternamen verwenden müssen, können Sie die Einstellung außer Kraft setzen, indem Sie den Funktionsnamen verwenden, um den Parameter zu qualifizieren. Wie:

    ... WHERE v.id = room_code.id
    
  • Sie sollten den Typnamen nicht als Spaltennamen verwenden.

  • Sie sollten keine Groß-/Kleinschreibung ohne Anführungszeichen wie roomCode verwenden , die in Kleinbuchstaben umgewandelt wird, es sei denn, Sie setzen doppelte Anführungszeichen:"roomCode" .

->SQLfiddle mit 3 Varianten