Oracle触发器问题

来源:百度知道 编辑:UC知道 时间:2024/06/05 16:23:55
想实现一个触发器,在表LGT_RY_NB插入一条数据前,判断这条数据的SFZH是否like'%111111%' 如果是的话,把这条数据插入到LGT_RY_NB_BackUp表中,然后从LGT_RY_NB中根据ZJHM这个主键删除这条记录(或者禁止执行插入操作),否则的话不做任何操作。

就是判断一条数据的SFZH字段是否like 111111 是的话不让其插入数据库
create or replace trigger TRG_ChoseData After INSERT
ON LGT_RY_NB FOR EACH ROW
DECLARE

FOUND BOOLEAN;

BEGIN

IF :New.ZJHM Like '%1111111%'
Then
Delete From LGT_RY_NB Where ZKLSH=:new.zklsh;
Insert Into LGT_RY_NB_BackUp (ZKLSH,XM,SFZH) Values (:new.ZKLSH,:new.XM,:new.SFZH);

END IF;

-- ERRORS HANDLING
EXCEPTION
WHEN INTEGRITY_ERROR THEN
RAISE_APPLICATION_ERROR(ERRNO, ERRMSG);
END;

我的问题是如果Before INSERT ON LGT_RY_NB FOR EACH ROW 此时执行Delete From LGT_RY_NB Where ZKLSH=:new.zklsh;没有意义,因为这时候还没插入数据,可是如果After INSERT ON LGT_RY_NB FOR EACH ROW 又不能用 ;new 提取主键

既然是Before INSERT,当然是不需要Delete了,不过不能阻止Insert,你要阻止Insert可以抛出异常:
RAISE_APPLICATION_ERROR(-20055,'INVALID CODE');
-----------------
触发器不能阻止其基表所做的事情,只能改变其值。

======================================================

刚Gāиζ好 2009-11-26 22:13:12
如果抛出异常的话 除了不能插入这条数据外还对程序造成什么影响呢?比如严重影响运行效率?会这样么?

有影响,影响多大要看具体的逻辑处理。另外你的代码里要处理这个异常。
如果不用异常,你就得用变通的方法,你先记录到其他表,然后为让新插入的行不能使用,你可以将某个字段的值改为一个不可能的值(比如将时间修改为9999-12-31)。然后等待适当的时机处理这些数据。