2013-10-15 34 views
0

我寫PostgreSQL中的功能,並想知道如果我能做到以下幾點:如果循環PostgreSQL的問題

  1. 我有一個INSERT語句中的每一個。我可以爲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

當你嘗試它時會發生什麼? – SingleNegationElimination

+0

我不明白你在問什麼問題1. 對於問題2,你的更新語句應該是這樣的: UPDATE dwset SET lastdate = newDate WHERE foo = bar; - 除非你想更新dwset中的所有行 其他一些意見: - 循環的重點是什麼?它在我看來像循環代碼,循環只是複雜尋找沒有明顯的原因。 - lastdate來自哪裏?是應該是一個參數的功能? – Andrew

+0

@Andrew對於Q2,是的,它正在更新所有行(它只有一個記錄,表示記錄上的最後更新)。循環的要點是(實際上有13個案例(日期))插入最近13個日期的13條記錄。 lastdate是一個db列。對於Q1,我對Postgresql相當陌生,所以我不熟悉它的語法。按照上面的方法獲取它們之後,我可以傳遞formatdate1和formatdate2的值嗎? – arm

回答

0

一般而言,任何類型的插入,插入,更新循環將要遇到的問題,如果循環變得足夠大。我假設你想要做的事就像

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

我做這樣的假設,因爲沒有理由做一個循環,然後爲每一個不同的運行邏輯。

上面的問題是,當n變大(比方說超過一百個)時,您可能會開始遇到緩存管理問題,這可能會突然開始導致大量隨機磁盤I/O活動,並且很長的查詢。沒有什麼比想知道爲什麼給定的函數調用運行50次循環,例如100ms,但在1800000毫秒內運行1000次循環。 (去過也做過)。

一般來說,你想嘗試運行你的邏輯避免循環,而是改爲執行設置操作。

我希望這會有所幫助。真的很難看到你在問什麼。