主题:[讨论]求救!关于触发器!
macle0315
[专家分:0] 发布于 2007-11-26 15:39:00
这是一个为图书管理系统设计的触发器,规定每人最多借3本书。当向borrow表中插入数据后触发,请问如果插入后,读者借的书多于3本,怎么回滚操作? 或者插入数据前触发,如何终止插入操作?
谢谢!!
create or replace trigger max_borrow
after insert on system.borrow for each row
declare
num number;
begin
select count(book_id) into num
from system.borrow group by user_id having user_id=:new.user_id;
if num>3 then
***rollback;***
dbms_output.put_line('您借书已满3本,不能再借!');
end if;
end max_borrow;
最后更新于:2007-11-26 15:40:00
回复列表 (共6个回复)
沙发
happyboy2007 [专家分:3900] 发布于 2007-11-27 11:54:00
create or replace trigger max_borrow
before insert on system.borrow
for each row
declare
num number;
begin
select count(book_id) into num
from system.borrow group by user_id having user_id=:new.user_id;
if num>3 then
raise_application_error(-20000,'您借书已满3本,不能再借!');
end if;
end;
板凳
macle0315 [专家分:0] 发布于 2007-11-27 20:58:00
谢谢!不过只raise一个error,为什么会有下面的结果啊!
应该只有标记的那一个错误吧!
ERROR 位于第 1 行:
ORA-20000: 您借书已满3本,不能再借! ----------
ORA-06512: 在"SYS.MAX_BORROW", line 7
ORA-04088: 触发器 'SYS.MAX_BORROW' 执行过程中出错
3 楼
happyboy2007 [专家分:3900] 发布于 2007-11-28 16:10:00
在触发器中经常使用raise_application_error表示抛出动态异常。
在触发器里是不允许使用事务的,当触发器执行过程中出现错误时自动回滚。
我想了一下,把那个触发器作一些修改。
create or replace trigger max_borrow
before insert on system.borrow
for each row
declare
num number;
begin
select count(book_id) into num
from system.borrow group by user_id having user_id=:new.user_id;
if num>3 then
raise_application_error(-20000,'您借书已满3本,不能再借!');
end if;
exception
when others then
dbms_output.put_line(sqlcode||' '||sqlerrm);
end;
4 楼
macle0315 [专家分:0] 发布于 2007-11-29 19:55:00
谢谢大侠提点!不过我不太明白这句
sqlcode||' '||sqlerrm
初学Oracle,孤陋寡闻了,不知道是什么意思?
5 楼
happyboy2007 [专家分:3900] 发布于 2007-11-30 08:50:00
ORACLE 与 SQL SERVER 不同,在ORACLE中字符串连接用|| 表示。
sqlcode 是一个整数(-20000~-20999),表示动态异常的错误代码;sqlerrm 是字符串,表示动态异常的错误信息描述。
sqlcode||' '||sqlerrm 表示将 sqlcode、' '、sqlerrm 三者连接成为一个字符串而已。
6 楼
macle0315 [专家分:0] 发布于 2007-11-30 14:45:00
非常感谢!
我来回复