es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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 🙂

Tags:  , ,

Answer

  1. Avatar for 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ón RETURN QUERY.

    Aquí tienes el código modificado:

    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 
      RETURN QUERY 
          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
          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
    
          WHERE tb_finance.sponsor_name = sponsor_name 
             AND tb_register.register_ts > register_date
          ORDER BY tb_register.register_ts;
    END;
    $$LANGUAGE plpgsql;
    
    
    SELECT * FROM fn_get_info_by_sponsor('2021-06-02 00:00:00','Reebok')
    

    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ón SELECT. Además, he actualizado la declaración SELECT añadiendo la cláusula WHERE para filtrar los datos basados en los parámetros pasados a la función.

    ¡Espero que esto te ayude!

Comments are closed.