今天帮其他项目组同事写触发器。
由于本人以前未接触过触发器,周末去书城翻翻书看了下。
现把出现的问题记录如下。
ORA-04098 触发器无效或未通过重新验证
此处问题主要是触发器语法、语句写的有问题。
如声明变量
DECLARE ISA13 VARCHAR2(1); SELECT E1307 INTO ISA13 from USRA13 WHERE A0100 = :NEW.A0100;
此处 E1307 在数据库中为 VARCHAR2,一开始为图简便 把ISA13 声明为 NUMBER 类型。
查询触发器是否有效sql
select owner, object_name, object_type, status from dba_objects where object_name = 'TRIGGER_NAME';
当STATUS 为 VALID时,及触发器是正确的。
总结:ORA-04098主要是语法不正确或者变量声明赋值类型不正确等问题
ORA-01403 no data found 数据未找到
当时sql如下
SELECT E1307 INTO ISA13 from USRA13 WHERE A0100 = :NEW.A0100;
看错误楼主就明白是啥问题。so,当时sql 修改如下
SELECT nvl(E1307 ,3)INTO ISA13 from USRA13 WHERE A0100 = :NEW.A0100;
执行之后还是报错 ORA-01403,囧了~,上网搜之
先给出帮我解决问题的连接:http://blog.csdn.net/aiouwen521/article/details/5858841
修改代码如下,问题解决
begin SELECT E1307 INTO ISA13 from USRA13 WHERE A0100 = :NEW.A0100; exception when no_data_found then ISA13 := 3; end;
今天触发器又增加了新增,与删除时触发,
且新增、修改、删除时触发触发器后内部逻辑都略有不同
so 又添加如下代码
在Oracle 触发器中 通过 INSERTING UPDATING DELETING
来判断是做什么操作时触发的触发器
IF INSERTING THEN --新增时处理 END IF; IF UPDATING THEN --修改时处理 END IF; IF DELETING THEN --删除时处理 END IF;
写到此处,测试时发现,
当通过删除操作来触发触发器时,删除内部处理有些竟然没有执行。。。
What? 经过排查发现问题如下
--这是删除操作中的一个处理 WHERE A0100 = :NEW.A0100; -- 看到没,一开始睁大眼睛竟然不知道错误就在自己眼前 --修改为如下 WHERE A0100 = :OLD.A0100;
说明:Oracle 触发器的新旧值之分
一般触发器触发时,会产生一个新值与一个旧值 如下
新增只有新值:NEW , 删除只有旧值:OLD 修改两个值都有
INSERT | UPDATE | DELETE | |
NEW(新值) | √ | √ | |
OLD(旧值) | √ | √ |
如此,完成触发器之初体验。这种事果然比整理历史数据有成就感~哈哈!