在Oracle中使用触发器插入后更新同一表中的列

在Oracle中使用触发器插入后更新同一表中的列,oracle,Oracle,插入完成后,我需要更新同一表中的一列。插入已编码,无法更改。所以我们使用触发器方法来更新一列值 create or replace TRIGGER "BLT_TRIGGER" AFTER INSERT ON BLT_MAPPING FOR EACH ROW BEGIN UPDATE BLT_MAPPING SET FIELD_ID = (SELECT CASE WHEN CORR_TI = 'B' THEN '12345' ELSE '54321' END AS INSTITUTION

插入完成后,我需要更新同一表中的一列。插入已编码,无法更改。所以我们使用触发器方法来更新一列值

create or replace TRIGGER "BLT_TRIGGER" 
AFTER INSERT ON BLT_MAPPING 
FOR EACH ROW
BEGIN
UPDATE BLT_MAPPING 
SET FIELD_ID = (SELECT CASE WHEN CORR_TI = 'B' THEN '12345' ELSE '54321' END 
AS INSTITUTION FROM BROKER CO,LOAN LO
WHERE LO.CORR_ID = CO.CORR_ID AND LO.LOAN_ID = loanid_in_BLT_MAPPING_table 
whcih_got_inserted )
END;

我得到了清除错误。我在这件事上犯了什么错误

是否要更新刚插入的同一行?在这种情况下,您希望在插入触发器之前将其设置为
,并在将其插入表之前更改
:NEW.fieldid
。大概是这样的:

create or replace TRIGGER "BLT_TRIGGER" 
BEFORE INSERT ON BLT_MAPPING 
FOR EACH ROW
    l_new_fieldid     number; -- Or whatever the correct datatype is
BEGIN

    SELECT CASE WHEN CORR_TI = 'B' THEN '12345' ELSE '54321' END 
      INTO l_new_fieldid
      FROM BROKER CO,LOAN LO
     WHERE LO.CORR_ID = CO.CORR_ID 
       AND LO.LOAN_ID = :NEW.loanid;

    :NEW.fieldid := l_new_fieldid;

END;

但这是一个低劣的解决方案。触发器模糊了您真正要做的事情,并且在出现问题时很难调试。更好的解决方案是用您真正要做的事情来更正您的
INSERT
语句。

您正在尝试更新刚才插入的同一行吗?在这种情况下,您希望在插入触发器之前将其设置为
,并在将其插入表之前更改
:NEW.fieldid
。大概是这样的:

create or replace TRIGGER "BLT_TRIGGER" 
BEFORE INSERT ON BLT_MAPPING 
FOR EACH ROW
    l_new_fieldid     number; -- Or whatever the correct datatype is
BEGIN

    SELECT CASE WHEN CORR_TI = 'B' THEN '12345' ELSE '54321' END 
      INTO l_new_fieldid
      FROM BROKER CO,LOAN LO
     WHERE LO.CORR_ID = CO.CORR_ID 
       AND LO.LOAN_ID = :NEW.loanid;

    :NEW.fieldid := l_new_fieldid;

END;

但这是一个低劣的解决方案。触发器模糊了您真正要做的事情,并且在出现问题时很难调试。更好的解决方案是用您真正要做的事情来更正您的
INSERT
语句。

请显示您的errorINSERT无法更改?为什么不呢?为什么不考虑合并,这样插入和更新就可以在一条语句中使用WHERE条件;因此,有可能更正记录。此外,正如@eaolson正确指出的,触发器是模糊的。请显示您的errorINSERT无法更改?为什么不呢?为什么不考虑合并,这样插入和更新就可以在一条语句中使用WHERE条件;因此,有可能更正记录。此外,正如@eaolson正确指出的那样,触发器的作用是模糊的。谢谢它的作用。