是否有一个@@trancount在Oracle等效?



我正在寻找一些方法来复制Oracle中T-SQL的@@trancount行为,我找不到一个聪明的方法来做到这一点。

任何帮助都将是感激的:)

这在Oracle中有点陌生,因为通常会话中只打开一个事务。有关Oracle中事务概念的更多信息,请参阅文档

但是你可以查询v$transaction来查看当前会话中打开的事务。

select count(*) from v$transaction t
join v$session s on t.ses_addr = s.saddr
and s.AUDSID = Sys_Context('USERENV', 'SESSIONID'); 

如果您真的想要模拟@@trancount,您可以遵循以下方法

返回已经发生的BEGIN TRANSACTION语句的个数在当前连接上。在TSQL

PRINT @@TRANCOUNT  
--  The BEGIN TRAN statement will increment the  
--  transaction count by 1.  
BEGIN TRAN  
PRINT @@TRANCOUNT  
BEGIN TRAN  
PRINT @@TRANCOUNT  
--  The COMMIT statement will decrement the transaction count by 1.  
COMMIT  
PRINT @@TRANCOUNT  
COMMIT  
PRINT @@TRANCOUNT  
--Results  
--0  
--1  
--2  
--1  
--0  

在Oracle中没有这样的功能,但是可以通过一个变量来模拟。

set serveroutput on 
declare
vtrancount pls_integer := 0;
--  The BEGIN statement will increment the transaction count by 1.  
begin
vtrancount := vtrancount + 1;
dbms_output.put_line(vtrancount);
-- ... dml 
begin   
vtrancount := vtrancount + 1;
dbms_output.put_line(vtrancount);
... dml 
commit;  
vtrancount := vtrancount - 1;
dbms_output.put_line(vtrancount);
end;
commit; 
vtrancount := vtrancount - 1;
dbms_output.put_line(vtrancount);
exception when others then 
vtrancount := 0;
rollback;
raise;
end;
/

最新更新