2016-06-15 111 views
0

我是PGSQL的新手,並試圖在查詢結果的基礎上迭代數據庫函數中啓動一個循環,如下所示。我正在使用8.2版本。在if條件下基於查詢結果的循環語法

CREATE OR REPLACE FUNCTION demo(text) 
RETURNS SETOF activityhistoryview 
    LANGUAGE plpgsql STABLE 
    AS $_$ 
DECLARE 
tilldate ALIAS for $1; 
actrec revpro_500.activity%ROWTYPE; 
BEGIN 
    IF tilldate != '' THEN 
     FOR actrec IN 
      SELECT activity.* from revpro_500.activity WHERE activity.householdid = 950 
     LOOP 
    ELSE 
     FOR actrec IN 
      SELECT activity.* from revpro_500.activity WHERE activity.householdid = 500 
     LOOP  
    END IF; 

     BEGIN 
     /* rest code goes here */ 
     END 
    END LOOP; 
    RETURN; 
END;$_$; 

執行上面的函數後,我得到下面的錯誤。

錯誤:在語法錯誤或接近 「ELSE」

我是缺少在這裏?

+0

如果你是新到PostgreSQL,那麼爲什麼使用8.2版這已經是5年過去的EOL? PG 8.2比iPhone老! – Patrick

+0

@patric:這是一個滯後產品,我正在致力於 – deltaforce

回答

1

不能嵌套循環查詢這樣的。相反,先評估你想與tilldate做什麼,然後做一個單循環查詢:

CREATE OR REPLACE FUNCTION demo(tilldate text) RETURNS SETOF activityhistoryview 
    LANGUAGE plpgsql STABLE AS $_$ 
DECLARE 
    actrec revpro_500.activity%ROWTYPE; 
    hhid integer; 
BEGIN 
    IF tilldate != '' THEN 
     hhid = 950; 
    ELSE 
     hhid = 500; 
    END IF; 

    FOR actrec IN 
     SELECT * from revpro_500.activity WHERE householdid = hhid 
    LOOP 
     BEGIN -- Do you really need a transaction block? If not, remove BEGIN/END 
     -- rest code goes here 
     END 
    END LOOP; 
    RETURN; 
END;$_$; 
+0

感謝您的回覆。有效 !! – deltaforce

0

像大多數語言,你不能有你的控制結構重疊,所以上線前的ELSE你打開一個LOOP,但ELSE之前不要關閉它,所以ELSE沒有附加IF配對到它。

您可以將IF/ELSE塊放在循環內部或外部,但不能重疊。

例子:

-- Good 
LOOP 
    -- some computations 
    IF tilldate != '' THEN 
     EXIT; -- exit loop 
    ELSE 
     -- some computations 
    END IF; 
END LOOP; 

-- Good 
IF tilldate != '' THEN 
    LOOP 
     -- some computations 
    END LOOP; 
ELSE 
    LOOP 
     -- some computations 
    END LOOP; 
END IF;  

-- Bad 
IF 
    LOOP 
     -- some computations 
ELSE 
    -- some computations 
END IF; 
END LOOP;