请帮忙写个oracle触发器怎么写

查看: 1391|回复: 16
写了个触发器,思路很简单,就是出不来
论坛徽章:2
本帖最后由 unknown2010 于
17:12 编辑
写了个触发器思路很简单,就是实现不了。
思路:当更新 申请书递交详情 表的par_cla字段时,先判断 申请书递交详情 表的sub_time字段和sub_app是否为空,如果为空就抛出异常。如果不为空则 更新成功。
以下为触发器内容:
执行之后,在检查的那两个字段都为null的前提下,无论是否更新par_cla 为’1’,结果都一样,不但把异常的内容显示出来了,而且更新成功。郁闷。请高手帮忙看看。谢谢!
CREATE OR REPLACE TRIGGER PAR_CLA_INFO_TRI
AFTER UPDATE OF par_cla ON 申请书递交详情
FOR EACH ROW
&&WHEN (NEW.par_cla='1')
& && &&&IF ((: new.sub_time IS&&NULL) or (: old.sub_app IS& &NULL))&&THEN
& && && & dbms_output.put_line('错误');
& && && & ELSE
& && &INSERT INTO 上课情况(stu_no) values (:new.stu_no);
& && &&&END IF;
SQL& update 申请书递交详情 set par_cla='0' where stu_no=;
1 row updated
SQL& update 申请书递交详情 set par_cla='1' where stu_no=;
1 row updated-----------------------------------------------------------------------------------------
快里面的内容改成&&就解决了。原来 抛出错误RAISE_application_error(不是显示错误),会把执行DML触发器之前的那条DML操作取消,类似回滚。
& &&&IF ((:new.sub_timeIS not NULL) AND (:old.sub_appIS NOT&&NULL) AND (:new.par_cla ='1')) THEN&&& && &INSERT INTO 上党校情况(stu_no) values (:new.stu_no);ELSE &&RAISE_application_error(-20001,'抛出错误');end if; end
认证徽章论坛徽章:165
没仔细看,但是你只是让他打印异常,并没有告诉他异常要去干什么吧。
论坛徽章:0
同意楼上的说法。
论坛徽章:1
LZ给的信息有点少。
我简单分析了几点
1、确定你的数据是符合触发器触发的条件,并且符合IF/ELSE分支的条件
2、就你的代码, NEW.par_cla='1' 部分是不是缺少冒号
3、WHEN 条件是否缺少 ld.par_cla='0' 这种限制条件
4、sub_time 和sub_app 其中是否有字符串类型,如果有,个人感觉加上 NVL,或者 sub_app is null Or sub_app = '' 这种形式
5、Update发生错误,但没有进行处理,比如没有回滚,或者没有RASIE,或者没有自定义错误等
helonten 该用户已被删除
同意2楼观点。已经执行的触发器,并且输出了“错误”,只是你没有处理异常的逻辑。
论坛徽章:2
Naldonado 发表于
没仔细看,但是你只是让他打印异常,并没有告诉他异常要去干什么吧。
我的用意是,要是不满足条件,只抛出异常,并不执行更新。
但是现在,又抛出异常,又执行更新。显然有问题。而且无论是否是new.par_cla是否是为‘1’ 都执行了更新。
我在块开始之前就用了when(new.par_cla='1')来限制,意思是只当new.par_cla=‘1’时,触发器才起作用
认证徽章论坛徽章:165
zjxpcyc 发表于
LZ给的信息有点少。
我简单分析了几点
1、确定你的数据是符合触发器触发的条件,并且符合IF/ELSE分支的条 ...
oracle库的null和''是一致的。sqlserver是不同的。达梦两者可以兼容。
论坛徽章:2
helonten 发表于
同意2楼观点。已经执行的触发器,并且输出了“错误”,只是你没有处理异常的逻辑。
如果抛出‘错误’,就不能执行更新。但是显然现在IF THEN ELSE 已经不是二选一了,而是都去执行了。我不清楚怎么回事。。。
论坛徽章:1
unknown2010 发表于
如果抛出‘错误’,就不能执行更新。但是显然现在IF THEN ELSE 已经不是二选一了,而是都去执行了。我不清 ...
你给的脚本里,达不到你的要求啊,你只是输出错误,并不是抛出错误。
论坛徽章:2
zjxpcyc 发表于
LZ给的信息有点少。
我简单分析了几点
1、确定你的数据是符合触发器触发的条件,并且符合IF/ELSE分支的条 ...
1.数据是符合条件的。我要是把判断那两个字段为空的那句去掉。仅仅执行insert into是没问题的。
2.块开始之前的when条件中,NEW.par_cla是不需要冒号的。
3、stu_no是表的主键。我取的stu_no=的这个条件是我选取的特定的情况。我是看着这条数据来做操作的,没问题的。
4.sub_time是date类型,sub_app是varchar2类型的。对于特定的一行,这样操作是没什么问题的。
5.触发器中不能有回滚。我只能现在试一下把错误抛出来
itpub.net All Right Reserved. 北京皓辰网域网络信息技术有限公司版权所有    
 北京市公安局海淀分局网监中心备案编号: 广播电视节目制作经营许可证:编号(京)字第1149号您的举报已经提交成功,我们将尽快处理,谢谢!
你可以这样试一下:
select case when (ID='01') then NAME else '0' end from A
这样数据类型才是一致的...
大家还关注
(window.slotbydup=window.slotbydup || []).push({
id: '2081942',
container: s,
size: '1000,60',
display: 'inlay-fix'大家帮我写个触发器,刚接触触发器
[问题点数:20分,结帖人morrisonwu]
大家帮我写个触发器,刚接触触发器
[问题点数:20分,结帖人morrisonwu]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
本帖子已过去太久远了,不再提供回复功能。求高手帮忙写个触发器或存储过程!在线急等!
[问题点数:60分,结帖人average1986]
求高手帮忙写个触发器或存储过程!在线急等!
[问题点数:60分,结帖人average1986]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2015年4月优秀版主2014年11月论坛优秀版主
2016年4月 荣获微软MVP称号2015年4月 荣获微软MVP称号2014年4月 荣获微软MVP称号2013年4月 荣获微软MVP称号2009年1月 荣获微软MVP称号2012年4月 荣获微软MVP称号2011年4月 荣获微软MVP称号2010年4月 荣获微软MVP称号
2015年4月优秀版主2014年11月论坛优秀版主
2016年4月 荣获微软MVP称号2015年4月 荣获微软MVP称号2014年4月 荣获微软MVP称号2013年4月 荣获微软MVP称号2009年1月 荣获微软MVP称号2012年4月 荣获微软MVP称号2011年4月 荣获微软MVP称号2010年4月 荣获微软MVP称号
2011年12月 总版技术专家分月排行榜第三2011年9月 总版技术专家分月排行榜第三
2011年6月 MS-SQL Server大版内专家分月排行榜第一
2015年4月优秀版主2014年11月论坛优秀版主
2016年4月 荣获微软MVP称号2015年4月 荣获微软MVP称号2014年4月 荣获微软MVP称号2013年4月 荣获微软MVP称号2009年1月 荣获微软MVP称号2012年4月 荣获微软MVP称号2011年4月 荣获微软MVP称号2010年4月 荣获微软MVP称号
本帖子已过去太久远了,不再提供回复功能。求写一个触发器
[问题点数:20分,结帖人qinfujun]
求写一个触发器
[问题点数:20分,结帖人qinfujun]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2010年5月 总版技术专家分月排行榜第二2010年4月 总版技术专家分月排行榜第二
2011年7月 荣获微软MVP称号2010年7月 荣获微软MVP称号
2010年5月 总版技术专家分月排行榜第二2010年4月 总版技术专家分月排行榜第二
2011年7月 荣获微软MVP称号2010年7月 荣获微软MVP称号
2010年5月 总版技术专家分月排行榜第二2010年4月 总版技术专家分月排行榜第二
2011年7月 荣获微软MVP称号2010年7月 荣获微软MVP称号
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 触发器怎么写 的文章

 

随机推荐