sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL devuelve una función con un tipo de datos personalizado

Esto debería funcionar. El enum no debería ser un problema. Probado con Postgres 9.1 y 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);

Excepto ...

  • En versiones anteriores a la 9.2 solo puede usar parámetros posicionales (numéricos) ($1 ) en funciones SQL (a diferencia de las funciones plpgsql).
    En 9.2+ el nombre de la columna tendría prioridad, de modo que WHERE La cláusula de su código original siempre sería VERDADERA y todas las filas calificarían, excepto que su función solo devuelve la primera, ya que no devuelve un SETOF building_code .
    Cambie el nombre de su parámetro o use un parámetro posicional o, preferiblemente, ambos.
    Si debe usar nombres de parámetros en conflicto, puede anular la preferencia usando el nombre de la función para calificar el parámetro. Me gusta:

    ... WHERE v.id = room_code.id
    
  • No debe usar el nombre de tipo como nombre de columna.

  • No debe usar nombres de mayúsculas y minúsculas sin comillas como roomCode , que se doblará a minúsculas, a menos que entre comillas dobles:"roomCode" .

->SQLfiddle con 3 variantes