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.

PL/pgSQL: Función de Activador que devuelve datos incorrectos.

Tengo una función con los parámetros “select_date” y “sponsor” que se supone que debe devolver algunos datos de una tabla basados en los valores pasados como parámetros:

SET search_path to Olympic;

CREATE OR REPLACE FUNCTION fn_get_info_by_sponsor
       (register_date tb_register.register_ts%type, sponsor_name tb_finance.sponsor_name%type)
RETURNS SETOF sponsor_data LANGUAGE plpgsql AS $$
DECLARE
      sp_data sponsor_data ;
BEGIN
      SELECT 
                 tb_sponsor.email,
                 tb_finance.sponsor_name,
                 tb_athlete.name,
                 tb_discipline.name,
                 tb_register.round_number,  
                 tb_register.register_measure, 
                 tb_register.register_position,
                 DATE(tb_register.register_ts)

       INTO sp_data
       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_sponsor.email ;

      RETURN NEXT sp_data ;
END ;  
$$;

La función funciona parcialmente, pero DEVUELVE valores incorrectos. Cuando uso los parámetros ‘2021-06-02 00:00:00’, ‘Adidas’, donde ‘Adidas’ es el patrocinador, DEVUELVE sponsor_name como VISA:

SELECT * FROM fn_get_info_by_sponsor('2021-06-02 00:00:00', 'Adidas')

sponsor email, sponsor_name, athlete_name, discipline_name, round_number, register_measure, register_position, register_ts,
  NULL  "VISA"    "JACOBY Lydia"    "Swimming"    1   NULL    3   "2021-06-07"

¿Alguien puede ver qué estoy haciendo mal?

¡Gracias!

CREATE TYPE sponsor_data AS (
email email_type,
sponsor_name CHARACTER VARYING(100),
athletes_name CHARACTER VARYING(50),
discilpine_name CHARACTER VARYING(50),
round_number  INT ,
mark CHARACTER(12),
register_position INT,
register_ts  DATE
);
Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece haber un problema con la condición de UNION en las tablas tb_finance y tb_sponsor. La columna sponsor_name en la tabla tb_finance debería unirse con la columna sponsor_name en el parámetro de la función, en lugar de tb_sponsor.name.

    Por lo tanto, la condición de UNION corregida debería ser:

    ON (tb_finance.sponsor_name = sponsor_name)

    Esto debería recuperar el sponsor_name correcto basado en el parámetro pasado a la función.

Comments are closed.