ORACLE触发器的测试

本文介绍了如何在Oracle数据库中测试和调试触发器。通过在PL/SQL Developer中新建测试窗口,输入能触发触发器的SQL语句,如UPDATE或INSERT,然后添加调试信息进行逐步调试。在调试过程中,可以查看变量值,使用各种调试工具,如运行、逐行调试等。此方法适用于Oracle 8.17I及以上版本。另外,也可以将触发器的BEGIN部分转化为存储过程进行测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.打开并登录pl/sql,File->New->Test Window;

2.在出现的窗口中的begin后输入脚本,该语句应该能够调用存储过程、函数,或语句能触发触发器;

比如我为某个表users的insert操作建立了触发器,那么test中的语句就是

update TABLE1

或者

INSERT TABLE2

注意sql语句结尾不需要加分号。

3.这时候如果直接在测试窗口执行F9,不会进入调试状态,也不会执行上边的插入语句。需要在trigger右击,选中“添加调试信息”。

4. 这时F9进入调试状态,显示trigger创建语句,窗口上边有调试方式的按钮,分别是:运行、逐行调试、跳过方法调试、运行至下个断点、运行至下个异常点。

5.调试过程中可以把鼠标放在变量上,就可以看到变量的当前值。

如果要调试存储过程、方法,可直接右键就有“Test”。

查看变量还可以随时在varible List中输入我们想查看的变量,回车,即可看到。

注意 这个 要求 ORACLE 为8.17I 版本以上的

还有一个调试方法是 将TIRIGER中 BEGIN 开始的部分做一个存储过程

然后测试 这个存储过程

create or replace procedure test_bal_ic_total(store_no       number,
                                              ref_no         number,
                                              total_net_amnt number,
                                              net_amnt       number,
                                              appr_date      date,
                                              automatic number) is
begin
  DECLARE
    vstore_no       number(2);
    vref_no         number(6);
    vtotal_net_amnt number(15, 2);
    vnet_amnt       number(15, 2);
    vappr_date      date;
    vautomatic number(1);

    vcheckflag number(1);
    vord_no number(6);
    vord_year varchar2(4);
    updatenorow exception;
  BEGIN
    if sqlcode = -1403 then
      raise updatenorow;
    end if;
    vstore_no       := store_no;
    vref_no         := ref_no;
    vtotal_net_amnt := total_net_amnt;
    vnet_amnt       := net_amnt;
    vappr_date      := appr_date;
    vautomatic      := automatic;
    if (vautomatic = 0) then
      vcheckflag := 3;
    else
      vcheckflag := 2;
    end if;
    select ord_no, to_char(ord_date, 'yyyy')
      into vord_no, vord_year
      from orders
     where (store_no, ord_no) in
           (select store_no, ord_no
              from ord_ref
             where store_no = vstore_no
               and ref_no = vref_no);
    update bal_ic_total
       set perc                = decode(round((vtotal_net_amnt - vnet_amnt) * 100 /
                                              vnet_amnt,
                                              2),
                                        14.94,
                                        14.943,
                                        round((vtotal_net_amnt - vnet_amnt) * 100 /
                                              vnet_amnt,
                                              0)),
           amount_vat          = vtotal_net_amnt - vnet_amnt,
           ic_total_net_amnt   = vtotal_net_amnt,
           diff_total_net_amnt = ord_total_net_amnt - vtotal_net_amnt,
           checkflag           = vcheckflag,
           appr_date           = vappr_date
     where store_no = vstore_no
       and ord_no = vord_no
       and ord_total_net_amnt >= 0
       and checkflag != 4
       and ord_year = vord_year
       and flag = 0;
  exception
    when updatenorow then
      null;
    when others then
      dbms_output.put_line(to_char(sqlcode));
  END;

end test_bal_ic_total;
测试 这个过程,那么 把变量 带入就可以 测试
image
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值