PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PostgreSQL retorna uma função com um tipo de dados personalizado


Isso deve funcionar. O enum Não deveria ser um problema. Testado com Postgres 9.1 e 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);

Exceto ...

  • Nas versões antes da 9.2 você só pode usar parâmetros posicionais (numéricos) ($1 ) em funções SQL (ao contrário das funções plpgsql).
    Em 9.2+ o nome da coluna teria precedência, para que o WHERE cláusula do seu código original sempre seria TRUE e todas as linhas seriam qualificadas - exceto que sua função retorna apenas a primeira, pois ela não retorna um SETOF building_code .
    Renomeie seu parâmetro ou use o parâmetro posicional ou, de preferência, ambos.
    Se você precisar usar nomes de parâmetro conflitantes, poderá substituir a preferência usando o nome da função para qualificar o parâmetro. Como:
    ... WHERE v.id = room_code.id
    

  • Você não deve usar o nome do tipo como nome da coluna.
  • Você não deve usar nomes de maiúsculas e minúsculas sem aspas, como roomCode , que será dobrado para letras minúsculas, a menos que você coloque aspas duplas:"roomCode" .

->SQLfiddle com 3 variantes