假设我有一个名为“用户”的表。我有一个在插入“用户”表时触发的触发器。 有没有办法在触发器内获取插入的事务 id?
问问题
7433 次
2 回答
7
您可以使用该功能dbms_transaction.local_transaction_id
这是一个例子:(取自这里)
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;
/
于 2013-08-30T14:23:01.690 回答
2
使用 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
的当前运行。transaction identifier
xid
v$transaction
请注意,Oracle 仅在需要分配 时才分配事务标识符undo segment
,这意味着已执行 INSERT、UPDATE 或 DELETE DML 语句。
因此,只读事务不会分配事务标识符。
于 2019-01-16T20:07:51.490 回答