我的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
但是没有运气。知道这个错误的原因以及如何解决?
答案 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;
不确定为什么。如果有人可以在问题中给出的查询中找出错误,请告诉我。谢谢