PostgreSQL函数中的FOR循环条件

时间:2014-07-01 11:52:39

标签: function postgresql plpgsql sql-insert generate-series

以下是我的表结构

CREATE TABLE gtab86
(
  mlid integer DEFAULT nextval('seq_gtab86_id'::regclass),
  acyrid integer,
  lmonth integer,
  islocked boolean
)
  • 在此表中,lmonth是月份,acyrid是表示示例值1的年份。

  • 我写了以下Function以插入gtab86

CREATE OR REPLACE FUNCTION createmonthlock(iacyrid integer) 
    RETURNS void AS '
BEGIN 
   INSERT INTO gtab86(acyrid, lmonth) VALUES (iacyrid,1); 
   INSERT INTO gtab86(acyrid, lmonth) VALUES (iacyrid,2);
   INSERT INTO gtab86(acyrid, lmonth) VALUES (iacyrid,3); 
   INSERT INTO gtab86(acyrid, lmonth) VALUES (iacyrid,4); 
   INSERT INTO gtab86(acyrid, lmonth) VALUES (iacyrid,5); 
   INSERT INTO gtab86(acyrid, lmonth) VALUES (iacyrid,6); 
   INSERT INTO gtab86(acyrid, lmonth)VALUES (iacyrid,7); 
   INSERT INTO gtab86(acyrid, lmonth)VALUES (iacyrid,8); 
   INSERT INTO gtab86(acyrid, lmonth)VALUES (iacyrid,9); 
   INSERT INTO gtab86(acyrid, lmonth)VALUES (iacyrid,10); 
   INSERT INTO gtab86(acyrid, lmonth)VALUES (iacyrid,11); 
   INSERT INTO gtab86(acyrid, lmonth)VALUES (iacyrid,12);
END;' 
LANGUAGE plpgsql VOLATILE COST 100;

如您所见,插入重复12次(对于12 lmonth个字段行) 如何只进行一次插入查询? 是否可以在函数中使用for 0 to 12种类的东西?

2 个答案:

答案 0 :(得分:3)

您可以根据insert .. select使用generate_series()

你也不需要PL / pgSQL,一个普通的SQL函数可以:

create or replace function createmonthlock(iacyrid integer) 
 returns void
as
$body$
   INSERT INTO gtab86(acyrid, lmonth) 
   select iacyrid, num
   from generate_series(1,12) num;
$body$
language sql;

答案 1 :(得分:0)

您可以使用单个INSERT语句插入多行:

INSERT INTO gtab86(acyrid, lmonth) VALUES (iacyrid,1), (iacyrid,2), (iacyrid,3), (iacyrid,4), (iacyrid,5), (iacyrid,6), (iacyrid,7), (iacyrid,8), (iacyrid,9), (iacyrid,10), (iacyrid,11), (iacyrid,12);