2016-06-15 112 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;