請教Trigger裡面exception該如何使用阿?

[复制链接]
查看11 | 回复5 | 2013-1-29 11:27:26 | 显示全部楼层 |阅读模式
俺寫了一段trigger如下
CREATE OR REPLACE TRIGGER CPT.spc3_idd1
after inserton CPT.paneltestqcdata1
for each row
declare
m_prod_nbrvarchar2(7);
m_cnt
number(1);
m_inbasevarchar2(3);
m_pnl_idvarchar2(9);
begin
if inserting then
select substr(b.prod_id,5,7),substr(b.prod_id,18,3) into m_prod_nbr,m_inbase from lot a,brmproduct b where a.prod_key=b.prod_key and a.lot_id=:new.panel_id;
select cnt,pnl_id into m_cnt,m_pnl_id from spc3_iddslts where prod_nbr=m_prod_nbr;
insert into spc3_idd (pnl_id,inbase,PROD_NBR,TXN_TIME,IDD1)
values (:new.panel_id,m_inbase,m_prod_nbr,TO_DATE(:new.create_datetime,'YYYY/MM/DD HH24:MI:SS'),:new.idd);
insert into spc3_iddslts (pnl_id,prod_nbr,cnt)
values (:new.panel_id,m_prod_nbr,1);
END IF;
end spc3_idd1;
因為select cnt,pnl_id into m_cnt,m_pnl_id from spc3_iddslts where prod_nbr=m_prod_nbr;[/COLOR] 會找不到數據,所以下面的兩句insert 指令都不會執行到.
好像可以用
exception
when no_data_found then
....
end
這樣的方式可以忽略null繼續執行insert的功能.
具體的寫法,插在程序的哪裡就請教大家了,謝謝!
回复

使用道具 举报

千问 | 2013-1-29 11:27:26 | 显示全部楼层
加在end spc3_idd1;之前
回复

使用道具 举报

千问 | 2013-1-29 11:27:26 | 显示全部楼层
請問when no_data_found then後面要怎麼寫呢?我試了null; return; 這些都不管用.難道要把insert 的指令再寫到then後面,感覺這樣有點重複了.
回复

使用道具 举报

千问 | 2013-1-29 11:27:26 | 显示全部楼层
搞个BEGIN END把你的中间程序给封装成一个子过程,然后把异常在这个子过程中处理,这样如果出现异常,会在这个子过程中处理掉,而程序可以接着运行而不会是中断,不知道是不是你需要的
回复

使用道具 举报

千问 | 2013-1-29 11:27:26 | 显示全部楼层
咦! 楼主的问题也正是我想问的, 我在此想多请教一下, 楼主的触发器中不是有多个select 语句吗? 那如果这多个语句都有可能滤不到数据, 而且我又想针对不同select濾不到語句做出不同的處理, 那這個exception when no_data_found 要如何寫呢? 好象一個trig中只會有一個这类异常处理接口,所以我现在的想法(不知是不是错的)就是只要trig中有語句沒有篩出記錄, 系統就會自動跳入此接口中進行處理, 是不是這樣?多謝各位指教!
回复

使用道具 举报

千问 | 2013-1-29 11:27:26 | 显示全部楼层
如四楼所说,封装起来就好了。每个子程序都有一个例外处理。
如果数据量不是很大, 也可以在每个select语句之前加一个select count(*) 判断一下是否有数据, 这样就不会因为null而跳出了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行