我正在寻找一些方法来复制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;
/