PLpgSQL:将每条记录存储在 For Loop 中并返回 json

Posted

技术标签:

【中文标题】PLpgSQL:将每条记录存储在 For Loop 中并返回 json【英文标题】:PLpgSQL: Store each record in For Loop and returns json 【发布时间】:2017-08-04 09:21:27 【问题描述】:

我正在尝试将记录或 json 存储到数组中并从函数返回 JSON:

CREATE OR REPLACE FUNCTION stat_per_day() RETURNS json AS $$
DECLARE 
RR RECORD;
SS json[];
BEGIN
  FOR RR IN (SELECT DISTINCT date 
      FROM timetable WHERE date<CURRENT_DATE ORDER BY date ASC)
  LOOP
    SELECT row_to_json(A) INTO SS FROM (SELECT RR.date as Dia, count(*) Total
    FROM dates WHERE office_date=RR.date) A;
  END LOOP;
  RETURN json_agg(SS);
END; $$
LANGUAGE plpgsql;

错误:

ERROR:  malformed array literal: ""dia":"2017-07-24","total":228"
DETAIL:  Unexpected array element.
CONTEXT:  PL/pgSQL function stat_per_day() line 8 at SQL statement

查询稍微复杂一点,但想法是将每个 forloop 查询“保存”在 json 数组或记录数组(我认为不存在)中,然后在循环后从数组中返回一个完整的 json。

【问题讨论】:

【参考方案1】:

可能你不需要 LOOP 循环吗?可以使用json_build_object 函数来完成此任务,例如:

CREATE OR REPLACE FUNCTION stat_per_day() RETURNS json AS $$
DECLARE 
SS json;
BEGIN
    select json_agg(j order by (j->>'dia')::date) from (
        SELECT json_build_object('dia', office_date, 'Total', count(*) ) as j 
        from dates
        where 
        office_date in (SELECT date FROM timetable WHERE date<CURRENT_DATE)
        group by office_date
    ) t
    into SS;

    RETURN SS;
END; $$
LANGUAGE plpgsql;

【讨论】:

以上是关于PLpgSQL:将每条记录存储在 For Loop 中并返回 json的主要内容,如果未能解决你的问题,请参考以下文章

如何将每条记录与另一条记录进行比较(名称反转问题)并删除重复记录?

Qt SQLite 批量插入优化(SQLite默认将每条语句看成单独的事务)good

在 For-Loop 上使用本地存储

在 postgresql 中使用 plpgsql 有啥好处

plpgsql insert 性能 测试

oracle存储过程for in loop的问题