Oracle触发器初体验

今天帮其他项目组同事写触发器。

由于本人以前未接触过触发器,周末去书城翻翻书看了下。

现把出现的问题记录如下。

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(旧值)      

如此,完成触发器之初体验。这种事果然比整理历史数据有成就感~哈哈!

 

 

 

 

posted @ 2014-03-03 15:28  登山看日出  阅读(322)  评论(0编辑  收藏  举报