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
);
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.