【问题标题】:Postgresql how to multiple stored procedure in transactionPostgresql如何在事务中使用多个存储过程
【发布时间】:2018-07-24 14:18:34
【问题描述】:

我的 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 中开始/结束事务 提示:改用带有 EXCEPTION 子句的 BEGIN 块。

【问题讨论】:

    标签: postgresql stored-procedures


    【解决方案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也在事务下执行。

    【讨论】:

    • 谢谢你的想法,但它不能解决我的问题。查看我的编辑
    • @AlexanderChandra - 只是你做不到。这项工作应该在 PostgreSQL 中以不同的方式实现。 PostgreSQL 的事务控制模型与您从 Oracle 或 MSSQL 所知道的不同,并且某些模式应该以不同的方式完成。无法以 1:1 的方式在这些数据库之间移动代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 2014-12-11
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    相关资源
    最近更新 更多