如何从 Oracle 中的 AFTER INSERT 触发器获取插入的主键值?
How can I get the inserted primary key value from AFTER INSERT trigger in Oracle?
我的 Oracle 数据库有一个 table DOC_WF_COMM
,它的主键是 DWFC_ID
。主键值基于名为 SQ_DOC_WF_COMM
.
的序列
我已经在 table 上创建了一个行级 AFTER INSERT
触发器,在触发器内部我需要将插入的记录与其他一些 table 连接起来,如下所示:
create or replace TRIGGER TRG_DOC_WF_COMM_AFT_INS AFTER INSERT ON DOC_WF_COMM REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
L_SUBJECT VARCHAR2(300);
L_BODY CLOB;
L_PNT_CODE VARCHAR(100) := NULL;
L_DR_PRJ_ID NUMBER(12);
L_STR_EMAIL VARCHAR2(120);
L_DWFC_TO_USR_ID VARCHAR2(12);
L_PNT_ID NUMBER(12);
L_PNT_EMAIL_YN VARCHAR(1);
L_PNT_ACTIVE_YN VARCHAR(1);
L_PNT_NOTIFY_YN VARCHAR(1);
BEGIN
IF INSERTING THEN
L_PNT_CODE := 'WFNT_MESSAGE';
SELECT DR_PRJ_ID, STR_EMAIL, DWFC_TO_USR_ID INTO L_DR_PRJ_ID, L_STR_EMAIL, L_DWFC_TO_USR_ID
FROM DOC_WF_COMM
JOIN DOC_WF_USERS ON DWFU_ID = DWFC_DWFU_ID
JOIN DOC_WORKFLOW ON DWF_ID = DWFU_DWF_ID
JOIN DOCUMENT_REF ON DR_ID = DWF_DR_ID
JOIN ST_REGISTER ON STR_ID = DWFU_STR_ID
WHERE DWFC_ID = :NEW.DWFC_ID AND DWFC_RESPONSE IS NULL;
-- SOME QUERIES HERE
END IF;
END;
触发器已成功编译,当我将记录插入 DOC_WF_COMM
table 时出现此错误:
ORA-01403: no data found ORA-06512
WHERE
子句中的错误是 :NEW.DWFC_ID
,我已将其更改为这些值:
:OLD.DWFC_ID
SQ_DOC_WF_COMM.NEXTVAL
SQ_DOC_WF_COMM.CURRVAL
但没有任何运气。知道为什么会出现此错误吗?我该如何解决?
如果我没理解错的话,请创建一个局部变量并将下一个序列值放入其中。然后它可以在整个代码中引用,始终具有相同的值。像这样:
declare
l_seq number := my_seq.nextval;
begin
insert into table_a (id, ...) values (l_seq, ...);
update table_b set id = l_seq where ...
select ... into ... from ... where id = l_seq;
end;
问题出在触发器中的这一行:
PRAGMA AUTONOMOUS_TRANSACTION;
这意味着触发器作为独立事务在单独的会话中执行,这意味着它看不到任何其他会话的未提交状态。至关重要的是,这包括触发触发器的会话,因此自主事务无法看到您刚刚插入的记录。因此,NO_DATA_FOUND.
您没有发布整个触发器或解释您要做什么,所以只有您自己知道为什么包含 PRAGMA。但是,您可能不需要它。删除 PRAGMA(和 COMMIT),您的触发器应该可以正常工作。
我将触发器内的查询更改为此,它工作正常
SELECT STR_PRJ_ID, STR_EMAIL, :NEW.DWFC_TO_USR_ID INTO L_DR_PRJ_ID, L_STR_EMAIL, L_DWFC_TO_USR_ID
FROM DOC_WF_USERS, ST_REGISTER
WHERE :NEW.DWFC_TO_USR_ID = DWFU_US_ID AND DWFU_STR_ID = STR_ID AND DWFU_ID = :NEW.DWFC_DWFU_ID;
不知道为什么会这样。如果有人能找出问题中给出的查询中的错误,请告诉我。谢谢
我的 Oracle 数据库有一个 table DOC_WF_COMM
,它的主键是 DWFC_ID
。主键值基于名为 SQ_DOC_WF_COMM
.
我已经在 table 上创建了一个行级 AFTER INSERT
触发器,在触发器内部我需要将插入的记录与其他一些 table 连接起来,如下所示:
create or replace TRIGGER TRG_DOC_WF_COMM_AFT_INS AFTER INSERT ON DOC_WF_COMM REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
L_SUBJECT VARCHAR2(300);
L_BODY CLOB;
L_PNT_CODE VARCHAR(100) := NULL;
L_DR_PRJ_ID NUMBER(12);
L_STR_EMAIL VARCHAR2(120);
L_DWFC_TO_USR_ID VARCHAR2(12);
L_PNT_ID NUMBER(12);
L_PNT_EMAIL_YN VARCHAR(1);
L_PNT_ACTIVE_YN VARCHAR(1);
L_PNT_NOTIFY_YN VARCHAR(1);
BEGIN
IF INSERTING THEN
L_PNT_CODE := 'WFNT_MESSAGE';
SELECT DR_PRJ_ID, STR_EMAIL, DWFC_TO_USR_ID INTO L_DR_PRJ_ID, L_STR_EMAIL, L_DWFC_TO_USR_ID
FROM DOC_WF_COMM
JOIN DOC_WF_USERS ON DWFU_ID = DWFC_DWFU_ID
JOIN DOC_WORKFLOW ON DWF_ID = DWFU_DWF_ID
JOIN DOCUMENT_REF ON DR_ID = DWF_DR_ID
JOIN ST_REGISTER ON STR_ID = DWFU_STR_ID
WHERE DWFC_ID = :NEW.DWFC_ID AND DWFC_RESPONSE IS NULL;
-- SOME QUERIES HERE
END IF;
END;
触发器已成功编译,当我将记录插入 DOC_WF_COMM
table 时出现此错误:
ORA-01403: no data found ORA-06512
WHERE
子句中的错误是 :NEW.DWFC_ID
,我已将其更改为这些值:
:OLD.DWFC_ID
SQ_DOC_WF_COMM.NEXTVAL
SQ_DOC_WF_COMM.CURRVAL
但没有任何运气。知道为什么会出现此错误吗?我该如何解决?
如果我没理解错的话,请创建一个局部变量并将下一个序列值放入其中。然后它可以在整个代码中引用,始终具有相同的值。像这样:
declare
l_seq number := my_seq.nextval;
begin
insert into table_a (id, ...) values (l_seq, ...);
update table_b set id = l_seq where ...
select ... into ... from ... where id = l_seq;
end;
问题出在触发器中的这一行:
PRAGMA AUTONOMOUS_TRANSACTION;
这意味着触发器作为独立事务在单独的会话中执行,这意味着它看不到任何其他会话的未提交状态。至关重要的是,这包括触发触发器的会话,因此自主事务无法看到您刚刚插入的记录。因此,NO_DATA_FOUND.
您没有发布整个触发器或解释您要做什么,所以只有您自己知道为什么包含 PRAGMA。但是,您可能不需要它。删除 PRAGMA(和 COMMIT),您的触发器应该可以正常工作。
我将触发器内的查询更改为此,它工作正常
SELECT STR_PRJ_ID, STR_EMAIL, :NEW.DWFC_TO_USR_ID INTO L_DR_PRJ_ID, L_STR_EMAIL, L_DWFC_TO_USR_ID
FROM DOC_WF_USERS, ST_REGISTER
WHERE :NEW.DWFC_TO_USR_ID = DWFU_US_ID AND DWFU_STR_ID = STR_ID AND DWFU_ID = :NEW.DWFC_DWFU_ID;
不知道为什么会这样。如果有人能找出问题中给出的查询中的错误,请告诉我。谢谢