【问题标题】:UPDATE Column in Same Table after INSERT using trigger in Oracle在 Oracle 中使用触发器 INSERT 后更新同一表中的列
【发布时间】:2018-12-01 10:20:11
【问题描述】:

插入完成后,我需要更新同一张表中的一列。 INSERT 已编码,无法更改。因此,我们将使用 TRIGGER 方法来更新一列值。

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;

我收到清除错误。我在薄触发器中犯了什么错误。

【问题讨论】:

  • 请显示您的错误
  • INSERT 不能更改?为什么不呢?
  • 为什么不考虑在单个语句中使用 WHERE 条件进行 INSERT 和 UPDATE 的 MERGE;因此,有可能更正记录。此外,正如@eaolson 正确指出的那样,触发器是模糊的

标签: oracle


【解决方案1】:

您是否尝试更新刚刚插入的同一行?在这种情况下,您希望将其设为BEFORE 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 声明,并使用您真正想要做的事情。

【讨论】:

  • 感谢它的工作。
猜你喜欢
  • 2016-06-17
  • 2015-08-08
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
  • 2011-05-31
  • 2021-06-14
  • 2023-03-31
  • 2016-06-24
相关资源
最近更新 更多