0

我正在 PostgreSQL 中编写一个函数,想知道是否可以执行以下操作:

  1. 我在每个 if 循环中都有一个插入语句。我可以为 formatdate1 和 formatdate2 传递这样的值吗?

  2. 我也在更新一张桌子。是我们如何做 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';
    
4

1 回答 1

0

一般来说,如果循环足够大,任何类型的插入、插入、更新循环都会遇到问题。我假设你想做类似的事情

 FOR 1 .. n
 LOOP
      INSERT INTO foo VALUES (...);
      INSERT INTO foo VALUES (...);
      UPDATE BAR set ....;
  END LOOP;

我做出这个假设是因为没有理由做一个循环然后为每个循环运行不同的逻辑。

上面的问题是,随着 n 变大(比如说,超过一百左右),您可能会开始遇到缓存管理问题,这可能会突然开始导致大量随机磁盘 I/O 活动和非常长的查询。没有什么比想知道为什么给定的函数调用会在 100 毫秒内运行 50 次循环迭代,但在 1800000 毫秒内运行 1000 次循环迭代。(去过也做过)。

一般来说,您想尝试运行您的逻辑以避免循环,而是执行设置操作。

我希望这有帮助。真的很难看出你在问什么。

于 2013-11-29T06:12:18.517 回答