在if条件下基于查询结果的循环语法
问题描述:
我是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”
我是缺少在这里?
答
不能嵌套循环查询这样的。相反,先评估你想与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
答
像大多数语言,你不能有你的控制结构重叠,所以上线前的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;
如果你是新到PostgreSQL,那么为什么使用8.2版这已经是5年过去的EOL? PG 8.2比iPhone老! – Patrick
@patric:这是一个滞后产品,我正在致力于 – deltaforce