Cómo utilizar correctamente la declaración DECLARE en una función plpgsql. ERROR: la consulta no tiene un destino para los datos de resultado.
He creado una función que debería devolver un conjunto de atributos de diferentes tablas basado en algunos parámetros.
Para obtener el resultado, he creado un TIPO y he aplicado múltiples declaraciones INNER JOIN.
Cuando llamo a la función, recibo el siguiente mensaje de error:
ERROR: la consulta no tiene un destino para los datos del resultado
SUGERENCIA: si desea descartar los resultados de una SELECT, utilice PERFORM en su lugar.
Aquí está mi código:
SET search_path to olympic;
CREATE OR REPLACE FUNCTION fn_get_info_by_sponsor
(register_date tb_register.register_ts%type, sponsor_name tb_sponsor.name%type)
RETURNS SETOF sponsor_data AS $$
DECLARE
data_sponsor sponsor_data;
email olympic.email_type;
sponsor_name tb_finance.sponsor_name%type;
athlete_name tb_athlete.name%type;
discilpine_name tb_discipline.name%type;
round_number tb_register.round_number%type;
mark tb_register.register_measure%type;
register_position tb_register.register_position%type;
register_date tb_register.register_ts%type;
BEGIN
SELECT
tb_finance.sponsor_name,
tb_sponsor.email email_type,
tb_athlete.name AS athlete_name,
tb_discipline.name AS discipline_name,
tb_register.round_number,
tb_register.register_measure,
tb_register.register_position,
tb_register.register_ts
INTO data_sponsor
FROM olympic.tb_sponsor
INNER JOIN olympic.tb_finance
ON (tb_finance.sponsor_name = tb_sponsor.name)
INNER JOIN olympic.tb_athlete
ON tb_athlete.athlete_id = tb_finance.athlete_id
INNER JOIN olympic.tb_register
ON tb_register.athlete_id = tb_athlete.athlete_id
INNER JOIN olympic.tb_discipline
ON tb_discipline.discipline_id = tb_register.discipline_id
ORDER BY tb_register.register_ts;
RETURN NEXT data_sponsor;
END;
$$LANGUAGE plpgsql;
SELECT * FROM fn_get_info_by_sponsor(‘2021-06-02 00:00:00′,’Reebok’)
Supongo que he cometido un error en la declaración DECLARE, pero no estoy seguro de cómo resolverlo. ¿Alguien puede ayudar?
(He utilizado múltiples tablas, por eso no estoy añadiendo las declaraciones CREATE TABLE aquí para simplificar)
Gracias 🙂
davy.ai
Parece que el mensaje de error indica que la función no tiene un destino para los datos de resultado. En este caso, la función devuelve un conjunto de atributos de diferentes tablas basado en algunos parámetros. Para solucionar este error, puedes cambiar la declaración
SELECT INTO
por una declaraciónRETURN QUERY
.Aquí tienes el código modificado:
Ten en cuenta que el código modificado utiliza una declaración
RETURN QUERY
para enviar los resultados de la consulta al llamador de la función. Esta declaración devuelve el conjunto de resultados tal como es generado por la declaraciónSELECT
. Además, he actualizado la declaraciónSELECT
añadiendo la cláusulaWHERE
para filtrar los datos basados en los parámetros pasados a la función.¡Espero que esto te ayude!