PostgreSQL如何在事务中多个存储过程

时间:2018-07-24 05:03:56

标签: postgresql stored-procedures

我的postgresql数据库中有很多存储过程, 出于某种原因,我需要在事务中运行许多过程,因此如果发生错误,它将回滚。

有什么办法吗?

编辑1

我通过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子句一起使用。

1 个答案:

答案 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也在事务下执行。