PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

PostgreSQL renvoie une fonction avec un type de données personnalisé

Cela devrait fonctionner. L'enum ne devrait pas être un problème. Testé avec Postgres 9.1 et 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);

Sauf ...

  • Dans les versions avant 9.2 vous ne pouvez utiliser que des paramètres positionnels (numériques) ($1 ) dans les fonctions SQL (contrairement aux fonctions plpgsql).
    Dans 9.2+ le nom de la colonne aurait la priorité, de sorte que le WHERE clause de votre code d'origine serait toujours TRUE et toutes les lignes seraient qualifiées - sauf que votre fonction ne renvoie que la première, car elle ne renvoie pas de SETOF building_code .
    Soit vous renommez votre paramètre, soit vous utilisez un paramètre positionnel ou, de préférence, les deux.
    Si vous devez utiliser des noms de paramètre en conflit, vous pouvez remplacer la préférence en utilisant le nom de la fonction pour qualifier le paramètre. Comme :

    ... WHERE v.id = room_code.id
    
  • Vous ne devez pas utiliser le nom du type comme nom de colonne.

  • Vous ne devez pas utiliser de noms de casse mixtes sans guillemets tels que roomCode , qui sera plié en minuscules, sauf si vous mettez entre guillemets :"roomCode" .

->SQLfiddle avec 3 variantes