【问题标题】:How to implement SAVE TRAN of MSSQL in PostgreSQL?如何在 PostgreSQL 中实现 SQL 的 SAVE TRAN?
【发布时间】:2020-12-09 17:48:44
【问题描述】:

期待PostgreSQL中的等价代码,特别是如何实现SAVE TRAN@@trancount@@error

以下代码在 MSSQL 中,需要迁移:

CREATE PROCEDURE [APPLY_TRANSCO_CASH]
  AS
 BEGIN
DECLARE 
    @trancount int,
    @error int,
    @rowcount int,
    @ret int
 SELECT @trancount = @@trancount
IF(@trancount <> 0)
BEGIN   
    SAVE TRAN tran_APPLY_TRANSC
END
ELSE
BEGIN
    BEGIN TRAN tran_APPLY_TRANSC
END

UPDATE ELIOT_TMp
SET Country = 'v'
SELECT @error = @@error, @rowcount = @@rowcount
IF (@error <> 0)
BEGIN 
    SELECT @ret = -1
    GOTO Error
END
SELECT @ret = @rowcount
GOTO Normal_End

Normal_End:
    IF (@trancount=0)
    BEGIN
        COMMIT TRANSACTION
    END
    RETURN @ret
Error:

    ROLLBACK TRANSACTION tran_APPLY_TRANSC
    RETURN @ret

【问题讨论】:

    标签: transactions database-migration plpgsql postgresql-11


    【解决方案1】:

    假设save tran 建立了一个保存点,我认为相当于:

    create procedure apply_transco_cash(inout retcode int)
    AS
    $$
    begin
    
      UPDATE eliot_tmp
        SET Country = 'v';
    
      -- this returns the number of affected rows
      GET DIAGNOSTICS recode = ROW_COUNT;
    
      commit;
        
    exception 
       when others then 
         retcode := -1;
    end;
    $$
    language plpgsql;
    

    为了处理错误,您在 PL/pgSQL 中使用 exception block,它会自动建立一个隐式保存点(在这种情况下“覆盖”从第一个 begin 开始的整个过程)。不需要显式设置保存点(并且不能回滚到 PL/pgSQL 中的保存点)

    GET DIAGNOSTICSis used 检索受最后一条语句影响的行数。

    【讨论】:

      猜你喜欢
      • 2020-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-14
      • 1970-01-01
      • 2018-06-26
      • 2017-09-19
      相关资源
      最近更新 更多