我试图运行此查询:
CREATE Function sp_test_case () returns void as $$
DECLARE
cont int=(Select MAX(id_fact)from backup_factura);
BEGIN
while cont>0
LOOP
UPDATE backup_factura
SET tipo= CASE
WHEN ((total_fact) <=100) THEN 'X'
WHEN ((total_fact) <=200) THEN 'Y'
ELSE 'Z'
END;
OUTPUT Deleted.tipo AS BeforeValue,
Inserted.tipo AS AfterValue
WHERE id_fact=cont;
cont:=cont-1;
END LOOP;
RETURN;
END;
$$ LANGUAGE plpgsql;
我调整了最初在SQL server中编写的代码。现在我怀疑是: 你知道OUTPUT语句的等价物吗?
OUTPUT子句用于显示假期前后值。 F.E:
OUTPUT Deleted.BusinessEntityID, Deleted.VacationHours AS BeforeValue,
Inserted.VacationHours AS AfterValue
有什么建议我需要做些什么才能让它发挥作用?
提前感谢您的时间和支持!
答案 0 :(得分:2)
你可以在没有函数或循环的情况下完成所有这些:
这将完成同样的事情:
UPDATE backup_factura
SET tipo = CASE
WHEN total_fact <=100 THEN 'X'
WHEN total_fact <=200 THEN 'Y'
ELSE 'Z'
END;
严格来说,你需要一个where id_fact >= 0
来完全模仿你的循环 - 但我猜你在那一栏中没有负值。
请注意, SQL case
语句只需要end
。 SQL 中没有end case
:http://www.postgresql.org/docs/9.3/static/functions-conditional.html
与SQL Server不同,Postgres(和许多其他DBMS)明确区分SQL(查询语言)和过程代码(在您的情况下为PL / pgSQL)。您不能混合使用这两种语言(SQL Server只有一种语言:T-SQL)。
PL / pgSQL中的case
语句确实是使用end case
终止的:http://www.postgresql.org/docs/9.3/static/plpgsql-control-structures.html#AEN58362
不确定output deleted
应该做什么,因为你没有删除任何内容。
要从更新语句返回新值,请使用returning
子句:http://www.postgresql.org/docs/current/static/sql-update.html