Oracle插入后更新字段值的BI_FILM_DESP触发器编写问题求助
Oracle触发器问题修正方案
现有代码错误点
- 触发器时机错误:使用
AFTER INSERT无法直接修改新插入行的字段值,应该改用BEFORE INSERT,直接操作内存中的新行数据即可,不需要额外执行INSERT/UPDATE语句 - 递归插入错误:触发器内部再次执行
INSERT INTO FILM会触发触发器递归调用,引发无限循环报错 - 字符串拼接语法错误:Oracle 字符串拼接需要使用
||运算符,你当前的写法不符合语法规范 - 条件逻辑错误:需求要求rating、language_id、original_language_id任意字段为NULL就保留原始description,对应的判断逻辑应该是三个字段同时不为NULL才执行拼接,你写的OR条件逻辑完全相反
- 全表更新错误:触发器内的UPDATE语句没有限定行范围,会修改全表所有符合条件的记录,不是仅修改当前新插入的行
正确实现代码
CREATE OR REPLACE TRIGGER "BI_FILM_DESP" BEFORE INSERT ON "FILM" FOR EACH ROW BEGIN -- 三个字段都不为空时才拼接描述 IF :NEW.RATING IS NOT NULL AND :NEW.LANGUAGE_ID IS NOT NULL AND :NEW.ORIGINAL_LANGUAGE_ID IS NOT NULL THEN :NEW.DESCRIPTION := :NEW.DESCRIPTION || '. ' || :NEW.RATING || ': Originally in ' || :NEW.ORIGINAL_LANGUAGE_ID || '. Re-released in ' || :NEW.LANGUAGE_ID; END IF; END; /
实现说明
- 用BEFORE INSERT触发器,在数据写入表之前直接修改新行的DESCRIPTION字段值,不需要额外执行DML语句,不会触发递归也不会锁全表
- 严格按照需求的逻辑判断,只有三个必填字段都不为空才执行拼接,否则保留原始DESCRIPTION值
- 字符串拼接使用Oracle标准的||运算符,符合语法要求
- 仅作用于当前插入的单行数据,不会影响表内的历史记录
内容的提问来源于stack exchange,提问作者Kayfi
相关产品推荐
相关产品推荐

