我的postgresql数据库中有很多存储过程, 出于某种原因,我需要在事务中运行许多过程,因此如果发生错误,它将回滚。
有什么办法吗?
我通过Java运行此程序,由于某种原因,我无法从Java进行事务,并且我无法运行查询字符串,仅存储过程而已。 我实际上在想像这样的程序
CREATE OR REPLACE FUNCTION ldt_pricing_rule_v1_api.start()
RETURNS VOID
LANGUAGE PLPGSQL
SECURITY DEFINER
AS $$
BEGIN
EXECUTE 'begin transaction'
RETURN;
END
$$;
select ldt_pricing_rule_v1_api.start();
但是它将显示此内容
错误:无法在PL / pgSQL中开始/结束事务 提示:请将BEGIN块与EXCEPTION子句一起使用。
答案 0 :(得分:1)
BEGIN ... COMMIT
应该可以工作。
BEGIN
SELECT func1();
SELECT func2();
COMMIT;
PostgreSQL 11(尚未发布)具有程序,您可以在其中明确控制事务。像其他任何数据库一样,过程由CALL
语句启动。现在,PostgreSQL函数不允许(显式)控制事务。
任何PostgreSQL函数都在事务下执行-由用户显式启动(如我的示例),或由系统隐式启动(通过自动提交模式)。
外部BEGIN
开始显式事务:
BEGIN
SELECT func1();
SELECT func2();
COMMIT;
,如果有任何未处理的失败,则仅ROLLBACK
命令可用。
或隐式事务:
CREATE OR REPLACE FUNCTION outerfx()
RETURNS void AS $$
BEGIN
PERFORM func1();
PERFORM func2();
END;
$$ LANGUAGE plpgsql;
SELECT outerfx(); -- starts outer transaction implicitly.
现在,函数func1,func2也在事务下执行。