如何在PostgreSQL中实现MSSQL的SAVE TRAN?

问题描述

期待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

解决方法

假设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 DIAGNOSTICS is used检索受最后一条语句影响的行数。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...