假设我有一个名为“用户”的表。我有一个触发器,触发插入“用户”表。 有没有办法在触发器内获取插入的事务ID?
答案 0 :(得分:4)
您可以使用dbms_transaction.local_transaction_id
以下是一个例子:(取自here)
SELECT dbms_transaction.local_transaction_id
FROM dual;
CREATE TABLE t (
testcol NUMBER(3));
INSERT INTO t
VALUES (1);
SELECT dbms_transaction.local_transaction_id
FROM dual;
CREATE OR REPLACE FUNCTION atf RETURN VARCHAR2 IS
PRAGMA AUTONOMOUS_TRANSACTION;
x VARCHAR2(20);
BEGIN
INSERT INTO t
(testcol)
VALUES
(2);
x := dbms_transaction.local_transaction_id;
COMMIT;
RETURN x;
END atf;
/
set serveroutput on
DECLARE
x VARCHAR2(20);
BEGIN
x := atf;
dbms_output.put_line(x);
INSERT INTO t VALUES (3);
x := dbms_transaction.local_transaction_id;
dbms_output.put_line(x);
COMMIT;
END;
/
答案 1 :(得分:0)
使用Oracle时,必须执行以下SQL查询:
SELECT tx.xid
FROM v$transaction tx
JOIN v$session s ON tx.ses_addr = s.saddr
v$transaction
视图提供有关当前正在运行的数据库事务的信息。但是,我们的系统中可能有多个交易正在运行,这就是为什么我们将v$transaction
与v$session
视图结合在一起。
v$session
视图提供有关我们当前会话或数据库连接的信息。通过在v$transaction
和v$session
视图之间匹配会话地址,我们可以在xid
视图中的v$transaction
列中找到当前正在运行的事务标识符。
请注意,Oracle仅在需要分配undo segment时才分配事务标识符,这意味着已经执行了INSERT,UPDATE或DELETE DML语句。
因此,只读事务将不会分配事务标识符。
有关此主题的更多详细信息,请查看this article。