How to use DECLARE statement in plpgsql function correctly. ERROR: query has no destination for result data
How to use DECLARE statement in plpgsql function correctly. ERROR: query has no destination for result data
我创建了一个函数,该函数应该 return 基于某些参数的来自不同表的一组属性。
为了获得结果,我创建了一个TYPE并应用了多个INNER JOIN语句
当我调用该函数时,我收到以下内容
ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.
这是我的代码:
将search_path设置为奥运会;
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')
我想我在 DECLARE 语句中犯了一个错误,但我不确定如何解决这个问题。有人可以帮忙吗?
(我使用了多个表,这就是为什么我不在此处添加 CREATE TABLE 语句以简化的原因)
谢谢(:
您可以在这里创建一个简单的 sql 函数 而不是 plpgsql 函数。
只需检查查询提供的字段列表,这些字段必须符合 sponsor_data
类型的正确字段顺序。
CREATE OR REPLACE FUNCTION fn_get_info_by_sponsor
(register_date tb_register.register_ts%type, sponsor_name tb_sponsor.name%type)
RETURNS sponsor_data LANGUAGE sql AS $$
SELECT row(
tb_sponsor.email,
tb_finance.sponsor_name,
tb_athlete.name AS athlete_name,
tb_discipline.name AS discipline_name,
tb_register.round_number,
tb_register.register_measure, -- = mark of type CHARACTER(12) ?
tb_register.register_position,
tb_register.register_ts -- = register_date of type date ?
) :: sponsor_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_register.register_ts ;
$$
SELECT * FROM fn_get_info_by_sponsor('2021-06-02 00:00:00','Reebok')
或者你可以创建一个PL/pgSQL函数来做同样的事情:
CREATE OR REPLACE FUNCTION fn_get_info_by_sponsor
(register_date tb_register.register_ts%type, sponsor_name tb_sponsor.name%type)
RETURNS sponsor_data LANGUAGE plpgsql AS $$
DECLARE
sp_data sponsor_data ;
BEGIN
SELECT row(
tb_sponsor.email,
tb_finance.sponsor_name,
tb_athlete.name AS athlete_name,
tb_discipline.name AS discipline_name,
tb_register.round_number,
tb_register.register_measure, -- = mark of type CHARACTER(12) ?
tb_register.register_position,
tb_register.register_ts -- = register_date of type date ?
) :: sponsor_data
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_register.register_ts ;
RETURN sp_data ;
END ;
$$
SELECT * FROM fn_get_info_by_sponsor('2021-06-02 00:00:00','Reebok')
我创建了一个函数,该函数应该 return 基于某些参数的来自不同表的一组属性。
为了获得结果,我创建了一个TYPE并应用了多个INNER JOIN语句
当我调用该函数时,我收到以下内容
ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.
这是我的代码:
将search_path设置为奥运会;
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')
我想我在 DECLARE 语句中犯了一个错误,但我不确定如何解决这个问题。有人可以帮忙吗?
(我使用了多个表,这就是为什么我不在此处添加 CREATE TABLE 语句以简化的原因)
谢谢(:
您可以在这里创建一个简单的 sql 函数 而不是 plpgsql 函数。
只需检查查询提供的字段列表,这些字段必须符合 sponsor_data
类型的正确字段顺序。
CREATE OR REPLACE FUNCTION fn_get_info_by_sponsor
(register_date tb_register.register_ts%type, sponsor_name tb_sponsor.name%type)
RETURNS sponsor_data LANGUAGE sql AS $$
SELECT row(
tb_sponsor.email,
tb_finance.sponsor_name,
tb_athlete.name AS athlete_name,
tb_discipline.name AS discipline_name,
tb_register.round_number,
tb_register.register_measure, -- = mark of type CHARACTER(12) ?
tb_register.register_position,
tb_register.register_ts -- = register_date of type date ?
) :: sponsor_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_register.register_ts ;
$$
SELECT * FROM fn_get_info_by_sponsor('2021-06-02 00:00:00','Reebok')
或者你可以创建一个PL/pgSQL函数来做同样的事情:
CREATE OR REPLACE FUNCTION fn_get_info_by_sponsor
(register_date tb_register.register_ts%type, sponsor_name tb_sponsor.name%type)
RETURNS sponsor_data LANGUAGE plpgsql AS $$
DECLARE
sp_data sponsor_data ;
BEGIN
SELECT row(
tb_sponsor.email,
tb_finance.sponsor_name,
tb_athlete.name AS athlete_name,
tb_discipline.name AS discipline_name,
tb_register.round_number,
tb_register.register_measure, -- = mark of type CHARACTER(12) ?
tb_register.register_position,
tb_register.register_ts -- = register_date of type date ?
) :: sponsor_data
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_register.register_ts ;
RETURN sp_data ;
END ;
$$
SELECT * FROM fn_get_info_by_sponsor('2021-06-02 00:00:00','Reebok')