No pgAdminIII eu crio uma função que retorna várias linhas em uma única coluna chamada identificador usando RETURN TABLE:
CREATE OR REPLACE FUNCTION test(
IN parm1 date,
IN parm2 interval)
RETURNS TABLE(identifier INT)
AS
$BODY$
BEGIN
RETURN QUERY
SELECT 1;
END;
$BODY$
LANGUAGE plpgsql;
Depois que a função é criada, pgAdminIII mostra a função como tendo a seguinte definição:
CREATE OR REPLACE FUNCTION test(IN parm1 date, IN parm2 interval)
RETURNS SETOF integer AS
$BODY$
BEGIN
RETURN QUERY
SELECT 1;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
Ao executar a função segue a lógica do RETURNS TABLE
. Mas, ao editar a função, ele irá selecionar o arquivo RETURNS SETOF
. Isso fornece uma funcionalidade diferente da função que especifiquei (por exemplo, o nome da coluna retornada não existe mais).
Então, como posso forçar o pgAdminIII a manter o nome da coluna retornada de identifier
? Eu particularmente não me importo se eu o defino como um TABLE
ou SETOF
.
O que você vê é obviamente um bug de exibição no atual pgAdmin 1.20. Eu poderia reproduzi-lo.
Você deve estar ciente de que o código que você vê foi reprojetado a partir das entradas da tabela do sistema.
Se você procurar sua função diretamente nos catálogos do sistema, descobrirá que o tipo de retorno foi registrado corretamente (pelo menos funciona para mim na página 9.4):
Funções mais úteis como
pg_get_functiondef()
no manual.Você pode pedir isso na lista de suporte do pgAdmin:
http://www.postgresql.org/list/pgadmin-support/
Envie um e-mail para [email protected]
Sua abordagem com
RETURNS TABLE(identifier int)
é o caminho certo.RETURNS SETOF
não aceita um nome de parâmetro, a menos que você o combine com umOUT
parâmetro . Igual a: