如何从Oracle中的AFTER INSERT触发器获取插入的主键值?

时间:2018-08-16 03:40:31

标签: oracle oracle11g oracle10g oracle-sqldeveloper database-trigger

我的Oracle数据库有一个表DOC_WF_COMM,其主键为DWFC_ID。主键值基于称为SQ_DOC_WF_COMM的序列。

我已经在该表上创建了行级AFTER INSERT触发器,在触发器内部,我需要将插入的记录与其他一些表连接起来,如下所示:

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表中时,出现此错误:

ORA-01403: no data found ORA-06512

错误是:NEW.DWFC_ID子句中的WHERE,我将其更改为以下值:

  • :OLD.DWFC_ID
  • SQ_DOC_WF_COMM.NEXTVAL
  • SQ_DOC_WF_COMM.CURRVAL

但是没有运气。知道这个错误的原因以及如何解决?

3 个答案:

答案 0 :(得分:4)

问题是触发器中的这一行:

df <- df %>%
filter(rule != 'remove') %>%  # this filters out any rows that fit remove rules above
select(-rule) ## this remove the rule column

这意味着触发器在单独的会话中作为隔离的事务执行,这意味着它看不到任何其他会话的未提交状态。最重要的是,这包括触发触发器的会话,因此自主事务无法看到您刚刚插入的记录。因此,为NO_DATA_FOUND。

您尚未发布整个触发器,也没有说明您要执行的操作,因此只有您知道为什么包含PRAGMA。但是,您可能不需要它。删除PRAGMA(和COMMIT),触发器就可以正常工作了。

答案 1 :(得分:1)

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

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;

答案 2 :(得分:0)

我将触发器内的查询更改为此,它工作正常

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;

不确定为什么。如果有人可以在问题中给出的查询中找出错误,请告诉我。谢谢