我正在PostgreSQL中编写一个函数,并想知道我是否可以执行以下操作:
我在每个if循环中都有一个insert语句。我可以为formatdate1和formatdate2传递这样的值吗?
我也在更新表格。我们是怎么做的PostgreSQL?
CREATE OR REPLACE FUNCTION Check returns void AS $$
DECLARE
startDate=date;
formateDate1=date; formatdate2=date;newDate=date;
BEGIN
startDate:= SELECT to_date(lastdate::date, 'MM-DD-YYYY') FROM setup;
for i in 1..3 LOOP
IF i = 1 THEN
formateDate1 := select (startDate - INTERVAL '11 months');
formatdate2:= to_date(formatdate2::date,'YYYYMM');
insert into warehouse.memcnts1 (select distinct source,
formatdate2
as yearmo, to_date(formateDate1, 'MM-DD-YYYY')
where effdt <= formateDate1 and enddt >= formateDate1);
ELSIF i = 2 THEN -- this is todays date
--insert query here
insert into warehouse.memcnts1 (select distinct source,formatdate2 as yearmo, to_date(formateDate1, 'MM-DD-YYYY') where effdt <= formateDate1
and enddt >= formateDate1);
ELSIF i = 3 THEN
formateDate1 := select (startDate + INTERVAL '1 months');
newDate=formateDate1;
update dwset SET lastdate := newDate; -- wonder if this is right?
formatdate2:=startDate;
END IF;
END LOOP;
END
$$ language 'plpgsql';
答案 0 :(得分:0)
通常,如果循环变得足够大,任何类型的insert,insert,update循环都会遇到问题。我假设你想做一些像
这样的事情 FOR 1 .. n
LOOP
INSERT INTO foo VALUES (...);
INSERT INTO foo VALUES (...);
UPDATE BAR set ....;
END LOOP;
我做出了这个假设,因为没有理由做一个循环,然后为每个循环运行不同的逻辑。
上面的问题是,当n变大(比方说,超过一百左右)时,您可能会开始遇到缓存管理问题,这些问题可能会突然开始导致大量随机磁盘I / O活动长查询。没有什么比想知道为什么给定的函数调用在100ms的循环中运行50次迭代,但在1800000 ms内运行1000次迭代的循环。 (去过那里,完成了)。
通常,您希望尝试运行逻辑避免循环,而是执行set操作。
我希望这会有所帮助。很难看出你在问什么。