【发布时间】:2021-12-08 09:14:56
【问题描述】:
我有一个带有参数“select_date”和“sponsor”的函数,它应该根据作为参数传递的值返回一些数据表:
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 ;
$$;
该函数部分工作,但它返回不正确的值。当我使用参数 '2021-06-02 00:00:00', 'Adidas' 其中 'Adidas' 是赞助商时,它会将赞助商名称返回为 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"
谁能看出我做错了什么?
谢谢!
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
);
【问题讨论】:
-
好吧,您不要使用 WHERE 子句中的参数来限制结果。而且您也只返回查询的第一行。
-
@a_horse_with_no_name SETOF 语句是否应该返回行集?
-
不,“return”语句从函数返回一些东西。您正在使用您的 return 语句返回一行。
-
你运行
return next一次,所以你只返回一行。 -
RETURN SETOF是函数定义的一部分。它不返回任何东西。return next每次运行时返回一行。您的代码只运行return next一次,因此您的函数将永远不会返回超过一行。
标签: postgresql plpgsql