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

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

  • 相关阅读:
    S1.2 Python开发规范指南
    time & datetime 模块
    10.27 sort
    basic play
    存储过程常规
    存储过程常规
    div学习之div中dl-dt-dd的详解
    div学习之div中dl-dt-dd的详解
    动态代理与静态代理的区别
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
  • 原文地址:https://www.cnblogs.com/yehshuai/p/3578437.html
Copyright © 2020-2023  润新知