连续插入相同的新记录时,触发器为何不发生作用?

Michael_Cao_Zhi 2010-08-19 05:19:25
create or replace trigger tri_voucher_唯一性
before insert on voucher
for each row
declare

i int := 0;
begin

/*select * from (select * from voucher where occured_date <= SYSDATE AND occured_date > to_date(EXTRACT(year from sysdate)-1||'/12'||'/31','YYYY/MM/DD')) A
WHERE A.GENERAL_WORD like '06付%';*/

--取当年度所有相同总字第几字的值之和;
select count(*)
into i
from (select *
from voucher
where occured_date <= SYSDATE
AND occured_date >
to_date(EXTRACT(year from sysdate) - 1 || '/12' || '/31',
'YYYY/MM/DD')) A
Where general_word = :new.general_word
and sequence_nbr = :new.sequence_nbr;

if (i > 0) then
raise_application_error(-20001,
'在本会计年度,已存在相同的序列号和总字号');
end if;
end tri_voucher_唯一性;
...全文
106 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Michael_Cao_Zhi 2010-08-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ngx20080110 的回复:]
引用 8 楼 michael_cao_zhi 的回复:
想了半天不知道发哪部分才好,因为有主从两张表,并且相关联一个带表参数和记录参数的存储过程再加上这个触发器;

看看這:http://blog.csdn.net/nGX20080110/archive/2010/08/19/5825028.aspx
[/Quote]

虽说提供的网页说明与我的问题不是一回事,但是感谢你的热心,现将分全给你.

今天重开机后,ORACLE不存在我所提出的这个问题了,触发器能正常工作.连续插入新数据会报错了,好奇怪!
ngx20080110 2010-08-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 michael_cao_zhi 的回复:]
想了半天不知道发哪部分才好,因为有主从两张表,并且相关联一个带表参数和记录参数的存储过程再加上这个触发器;
[/Quote]
看看這:http://blog.csdn.net/nGX20080110/archive/2010/08/19/5825028.aspx
Michael_Cao_Zhi 2010-08-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ngx20080110 的回复:]
引用 6 楼 michael_cao_zhi 的回复:
引用 5 楼 ngx20080110 的回复:
引用 4 楼 michael_cao_zhi 的回复:
我在插入时,用的是存储过程,在存储过程顺利完成后,即COMMIT;C#客户端conn.close();然后紧跟又插入相同的记录;为何会出现触发器不识别的现象呢?

那這樣的話,設置一個約束不就更方便麼?


如何设置在指定范……
[/Quote]

想了半天不知道发哪部分才好,因为有主从两张表,并且相关联一个带表参数和记录参数的存储过程再加上这个触发器;
ngx20080110 2010-08-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 michael_cao_zhi 的回复:]
引用 5 楼 ngx20080110 的回复:
引用 4 楼 michael_cao_zhi 的回复:
我在插入时,用的是存储过程,在存储过程顺利完成后,即COMMIT;C#客户端conn.close();然后紧跟又插入相同的记录;为何会出现触发器不识别的现象呢?

那這樣的話,設置一個約束不就更方便麼?


如何设置在指定范围内的多字段的唯一性约束?
[/Quote]
你把表結構發來我在這邊試試
Michael_Cao_Zhi 2010-08-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ngx20080110 的回复:]
引用 4 楼 michael_cao_zhi 的回复:
我在插入时,用的是存储过程,在存储过程顺利完成后,即COMMIT;C#客户端conn.close();然后紧跟又插入相同的记录;为何会出现触发器不识别的现象呢?

那這樣的話,設置一個約束不就更方便麼?
[/Quote]

如何设置在指定范围内的多字段的唯一性约束?
ngx20080110 2010-08-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 michael_cao_zhi 的回复:]
我在插入时,用的是存储过程,在存储过程顺利完成后,即COMMIT;C#客户端conn.close();然后紧跟又插入相同的记录;为何会出现触发器不识别的现象呢?
[/Quote]
那這樣的話,設置一個約束不就更方便麼?
Michael_Cao_Zhi 2010-08-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ngx20080110 的回复:]
在行級觸發器中,不能看到insert的新紀錄。
在before行級觸發器中,將新insert的數據記錄到一個package的變量裡,
然後再建一個after語句級觸發器試一下吧。
[/Quote]

我在插入时,用的是存储过程,在存储过程顺利完成后,即COMMIT;C#客户端conn.close();然后紧跟又插入相同的记录;为何会出现触发器不识别的现象呢?
minitoy 2010-08-19
  • 打赏
  • 举报
回复
对于还没commit得insert记录,对其他session是不可见的。
duqiangcise 2010-08-19
  • 打赏
  • 举报
回复
那你修改成after触发器看看
ngx20080110 2010-08-19
  • 打赏
  • 举报
回复
在行級觸發器中,不能看到insert的新紀錄。
在before行級觸發器中,將新insert的數據記錄到一個package的變量裡,
然後再建一個after語句級觸發器試一下吧。

3,490

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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