1

下面给出的是我的表结构

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;

如您所见,insert into 重复了 12 次(对于 12 个lmonth字段行)。
如何使它只有一个插入查询?是否可以在函数
中使用for 0 to 12善良的东西?

4

2 回答 2

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;
于 2014-07-01T11:58:28.797 回答
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);

于 2014-07-01T11:57:22.787 回答