如何从plpgsql中的循环返回结果?
Posted
技术标签:
【中文标题】如何从plpgsql中的循环返回结果?【英文标题】:How to return results from a loop in plpgsql? 【发布时间】:2016-06-22 09:53:57 【问题描述】:我想查看显示日期的结果
"2001-01-01 00:00:00+05:30"
"2001-01-02 00:00:00+05:30"
"2001-01-03 00:00:00+05:30"
"2001-01-04 00:00:00+05:30"
"2001-01-05 00:00:00+05:30"
"2001-01-06 00:00:00+05:30"
"2001-01-07 00:00:00+05:30"
等等... 但我收到错误
ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT: PL/pgSQL function insert_date_dimension(date) line 12 at SQL statement
你能告诉我是什么问题
我创建的函数
create or replace function insert_date_dimension("Date" date)
returns text as
$$
Declare dat date;
start_date date;
end_date date;
Begin
start_date:='2016/01/01';
end_date:='2016/12/31';
while start_date<=end_date
loop
select start_date;
start_date:=start_date+ interval '1 day';
End loop;
return start_date;
end;
$$
LANGUAGE 'plpgsql';
你能告诉我这个函数有什么问题吗?我无法执行它。我想在 select statment 中获取所有列。请告诉我create or replace function insert_date_dimension("date" date)
returns setof date as $$
declare
dat date;
start_date date;
end_date date;
begin
start_date := '2016/01/01';
end_date := '2016/12/31';
while start_date <= end_date loop
--return next start_date;
select start_date,date_part('week',start_date),date_part('quarter',start_date),to_char(start_date, 'day'),to_char(start_date, 'month'),
extract(year from current_date),extract(month from current_date);
start_date:= start_date + interval '1 day';
end loop;
end;
$$ language plpgsql;
ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT: PL/pgSQL function insert_date_dimension(date) line 11 at SQL statement
********** Error **********
【问题讨论】:
不需要函数和循环;您可以使用generate_series('2001-01-01 00:00:00', '2010-01-01 00:00:00', '1day::interval)
生成时间序列。
错误信息很清楚:select
的结果需要存储在某处:postgresql.org/docs/current/static/…
【参考方案1】:
不需要用户定义的函数。只需使用generate_series
:
select generate_series('2016/01/01'::date, '2016/12/31', '1 day');
但如果你只是在摆弄plpgsql 那么return next
一个setof date
create or replace function insert_date_dimension("date" date)
returns setof date as $$
declare
dat date;
start_date date;
end_date date;
begin
start_date := '2016/01/01';
end_date := '2016/12/31';
while start_date <= end_date loop
return next start_date;
start_date := start_date + interval '1 day';
end loop;
end;
$$ language plpgsql;
plpgsql
是一个标识符。不要引用它。
【讨论】:
你能告诉我这个函数有什么问题吗?我无法执行它。 错误:查询没有结果数据的目的地 提示:如果要丢弃 SELECT 的结果,请改用 PERFORM。上下文:PL/pgSQL 函数 insert_date_dimension(date) 在 SQL 语句的第 11 行 @MegharajShetty 您正在运行 you 发布的功能,而不是 我 发布的功能 你的函数工作得很好。我刚刚根据我的要求修改了你的查询。我想选择周、季度、日名称和月份名称以及日期。 是否可以选择多个列作为返回下一列或在循环中选择..以上是关于如何从plpgsql中的循环返回结果?的主要内容,如果未能解决你的问题,请参考以下文章
从 plpgsql 函数中获取 Java ResultSet 的返回值
控制器中的 Laravel 通过记录从 foreach 循环返回新的结果集合