下面是我的表结构
CREATE TABLE gtab86
(
mlid integer DEFAULT nextval('seq_gtab86_id'::regclass),
acyrid integer,
lmonth integer,
islocked boolean
)
在这个表中,
lmonth
是月份,acyrid
是年份,表示示例 1 的值。我编写了以下
函数
以插入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
kind things?
最佳答案
您可以使用基于generate_series()
的insert ..select
。
为此你也不需要 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;
关于function - PostgreSQL 函数内的 FOR 循环条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24509623/