如何从 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,我已将其更改为这些值:

但没有任何运气。知道为什么会出现此错误吗?我该如何解决?

如果我没理解错的话,请创建一个局部变量并将下一个序列值放入其中。然后它可以在整个代码中引用,始终具有相同的值。像这样:

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;

不知道为什么会这样。如果有人能找出问题中给出的查询中的错误,请告诉我。谢谢