奇怪,为什么这个触发器要commit后才能触发?

flyboat 2004-11-22 02:43:09
小弟建立了一个如下触发器,每次向SMS_GetOrder添加一条记录后,还要执行一下commit;才能查到触发器向表SMS_Day_Report中添加了记录,若在触发器的begin...end间只有一个insert语句则一切正常:
create or replace trigger insert_GetOrder_report_test2
before insert on SMS_GetOrder
for each row
declare
recordNum BINARY_INTEGER; --是否有记录:0 or 1
hourStr CHAR(2);
begin
hourStr:=substr(to_char(sysdate,'yyyymmdd hh24:mi:ss'),10,2);

select count(id) into recordNum from SMS_Day_Report@DBLinkOperation
where to_char(RDate,'YYYYmmdd')=to_char(sysdate,'YYYYmmdd')
and AreaCode=:new.AreaCode
and CityNumber=:new.CityNumber
and Types=1;
IF recordNum=0 THEN

insert into SMS_Day_Report@DBLinkOperation (RDate,AreaCode,CityNumber,Types,H0)
values(sysdate,:new.AreaCode,:new.CityNumber,1,1);

END IF;
end;
...全文
316 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
hzg_yujia 2004-11-22
  • 打赏
  • 举报
回复
那个触发器和你的SMS_GetOrder表的插入操作是在一个事务中的。你的SMS_GetOrder表如果不commit的话,就相当于没有插入数据。当然也就不能触发SMS_Day_Report表的插入操作了
flyboat 2004-11-22
  • 打赏
  • 举报
回复
是在触发器中加一个 commit;语句吗?我在if ...then 中的insert语句后加了一条commit;后向sms_getorder插入数据时出现如下错误:
insert into sms_getorder(areacode,citynumber,usernumber,spnumber,msgcontent,reverttime,revertstate,Linkid)
*
ERROR 位于第 1 行:
ORA-02055: 分布式更新操作失效;要求回退
ORA-04092: COMMIT 不能在触发器中
ORA-06512: 在"WOODOSMSLOGS.INSERT_GETORDER_REPORT_TEST2", line 16
ORA-04088: 触发器 'WOODOSMSLOGS.INSERT_GETORDER_REPORT_TEST2' 执行过程中出错
zhpsam109 2004-11-22
  • 打赏
  • 举报
回复
只有一个insert语句,oracle会把他当作一个事务进行处理,如果还有别的语句,像你写的那样,要显式用用commit;提交!

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧