Erro ao chamar um função no Postgresql

3 respostas
postgresql
A

Fala galera,
Estou tentando criar uma função que retorna uma tabela no postgresql e está apresentando o seguinte erro ao chamar a mesma.
ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT: PL/pgSQL function ajuste_religador(integer) line 3 at SQL statement

Segui o código da função

CREATE OR REPLACE FUNCTION ajuste_religador(id_rel int)

RETURNS TABLE(status_ajuste_funa boolean, data_ajuste_funa date, descricao_funa varchar, ajuste_fase_funa float,

curva_fase_funa varchar, dial_fase_funa decimal, tmr_habilitado_fase_funa boolean, tmr_fase_funa decimal, ajuste_insta_fase_funa float,

tempo_insta_fase_funa decimal, ajuste_temp_neutro_funa float, curva_temp_neutro_funa varchar, dial_temp_neutro_funa decimal,

tmr_habilitado_neutro_funa boolean, tmr_neutro_funa decimal, ajuste_insta_neutro_funa float, tempo_insta_neutro_funa decimal,

quantidade_disparo_funa int, relig_1_funa int, relig_2 int, relig_3 int, tempo_rearme_funa int,	

status_ajuste_funb boolean, ajuste_fase_funb float,

curva_fase_funb varchar, dial_fase_funb decimal, tmr_habilitado_fase_funb boolean, tmr_fase_funb decimal, ajuste_insta_fase_funb float,

tempo_insta_fase_funb decimal, ajuste_temp_neutro_funb float, curva_temp_neutro_funb varchar, dial_temp_neutro_funb decimal,

ajuste_rapida_neutro_funb float, curva_rapida_neutro_funb varchar, dial_rapida_neutro_funb decimal,

tmr_habilitado_neutro_funb boolean, tmr_neutro_funb decimal, ajuste_insta_neutro_funb float, tempo_insta_neutro_funb decimal,

quantidade_disparo_funb int, relig_1_funb int, relig_2_funb int, relig_3_funb int, tempo_rearme_funb int)

AS $$

BEGIN

SELECT tja.status_ajuste, tja.data_ajuste, tja.descricao, tja.ajuste_fase,

tja.curva_fase, tja.dial_fase, tja.tmr_habilitado_fase, tja.tmr_fase, tja.ajuste_insta_fase,

tja.tempo_insta_fase, tja.ajuste_temp_neutro, tja.curva_temp_neutro, tja.dial_temp_neutro,

tja.tmr_habilitado_neutro, tja.tmr_neutro, tja.ajuste_insta_neutro, tja.tempo_insta_neutro,

tja.quantidade_disparo, tja.relig_1, tja.relig_2, tja.relig_3, tja.tempo_rearme,	

tjb.status_ajuste, tjb.ajuste_fase,

tjb.curva_fase, tjb.dial_fase, tjb.tmr_habilitado_fase, tjb.tmr_fase, tjb.ajuste_insta_fase,

tjb.tempo_insta_fase, tjb.ajuste_temp_neutro, tjb.curva_temp_neutro, tjb.dial_temp_neutro,

tjb.ajuste_rapida_neutro, tjb.curva_rapida_neutro, tjb.dial_rapida_neutro,

tjb.tmr_habilitado_neutro, tjb.tmr_neutro, tjb.ajuste_insta_neutro, tjb.tempo_insta_neutro,

tjb.quantidade_disparo, tjb.relig_1, tjb.relig_2, tjb.relig_3, tjb.tempo_rearme

FROM tbl_ajuste_a_religador AS tja	

INNER JOIN tbl_ajuste_b_religador AS tjb

ON tja.id_equipamento = tjb.id_equipamento

WHERE tja.id_equipamento = id_rel AND tja.status_ajuste = true AND tjb.status_ajuste = true;

END

$$ LANGUAGE plpgsql

Código que chamo a função no banco

SELECT * FROM ajuste_religador(2)

3 Respostas

PedreiroDeSoftware

Vc está executando um select cujos registros não são aproveitados, por isto a dica/hint para usar o PERFORM.

Tente assim:



begin

return query select  where  limit 1;

end

$$ language plpgsql;
A

Não entendi.
A função vai retornar oque ? ou ela será do tipo VOID ?

PedreiroDeSoftware

A função que vc criou retorna uma tabela, não é do tipo void.
O retorno é aquilo que vc deseja que seja retornado e que vc indicou na instrução … RETURNS TABLE …
Por isso vc deveria adicionar RETURN QUERY SELECT … FROM … where … limit 1;
Como o id é único vc pode limitar a projeção para apenas 1 registro (limite 1).

Criado 18 de novembro de 2019
Ultima resposta 19 de nov. de 2019
Respostas 3
Participantes 2