如何在PostgreSQL中实现MSSQL的SAVE TRAN?
How to implement SAVE TRAN of MSSQL in PostgreSQL?
期待 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 检索受最后一条语句影响的行数。
期待 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 检索受最后一条语句影响的行数。