【问题标题】:How to insert data into table while looping in postgresql?如何在postgresql中循环时将数据插入表中?
【发布时间】:2016-06-23 04:06:39
【问题描述】:

我正在尝试将循环中的值插入到表中,但由于我的函数抛出错误而无法做到这一点..

我想将从 select 语句中获取的数据插入基表 Date_Dim。

CREATE OR REPLACE FUNCTION insert_date_dimension(
OUT "date" date,
OUT week integer,
OUT quarter integer,
OUT dayname text,
OUT monthname text,
OUT year integer,
OUT month integer
) RETURNS SETOF RECORD STABLE LANGUAGE plpgsql AS
 $$DECLARE
 dat date;
 start_date timestamp := '2016-01-01 00:00:00';
 end_date timestamp := '2016-12-31 00:00:00';
 BEGIN
   RETURN QUERY 
   insert into date_dim
   SELECT
       d::date,
       date_part('week', d)::integer,
       date_part('quarter', d)::integer,
       to_char(d, 'day'),
       to_char(d, 'month'),
       date_part('year', d)::integer,
       date_part('month', d)::integer
     FROM generate_series(start_date, end_date, '1 day') d(d);
END;$$;
ERROR:  cannot open INSERT query as cursor
CONTEXT:  PL/pgSQL function insert_date_dimension() line 6 at RETURN QUERY

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    我认为这不是选择查询。所以返回值应该是这样的

    RETURNS VOID
    

    而不是

    RETURN QUERY
    

    您还需要将 OUT 替换为 IN 作为参数

    【讨论】:

      【解决方案2】:

      如果要返回刚刚插入的行,需要使用returning

      你也可以使用returns setof date_dim来简化你的函数声明:

      CREATE OR REPLACE FUNCTION insert_date_dimension()
        RETURNS SETOF date_dim
        LANGUAGE plpgsql 
      AS
      $$
      DECLARE
       dat date;
       start_date timestamp := '2016-01-01 00:00:00';
       end_date timestamp := '2016-12-31 00:00:00';
      BEGIN
         RETURN QUERY 
         insert into date_dim
         SELECT
             d::date,
             date_part('week', d)::integer,
             date_part('quarter', d)::integer,
             to_char(d, 'day'),
             to_char(d, 'month'),
             date_part('year', d)::integer,
             date_part('month', d)::integer
           FROM generate_series(start_date, end_date, '1 day') d(d)
         returning *; --<< HERE
      END;
      $$
      ;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-30
        • 2021-03-21
        • 2022-01-01
        • 2017-03-13
        相关资源
        最近更新 更多