回 帖 发 新 帖 刷新版面

主题:[讨论]求救!关于触发器!

这是一个为图书管理系统设计的触发器,规定每人最多借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;

回复列表 (共6个回复)

沙发

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;

板凳

谢谢!不过只raise一个error,为什么会有下面的结果啊!
应该只有标记的那一个错误吧!

ERROR 位于第 1 行:
ORA-20000: 您借书已满3本,不能再借!   ----------
ORA-06512: 在"SYS.MAX_BORROW", line 7
ORA-04088: 触发器 'SYS.MAX_BORROW' 执行过程中出错

3 楼

在触发器中经常使用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 楼

谢谢大侠提点!不过我不太明白这句
sqlcode||'  '||sqlerrm
初学Oracle,孤陋寡闻了,不知道是什么意思?

5 楼

ORACLE 与 SQL SERVER 不同,在ORACLE中字符串连接用|| 表示。

sqlcode 是一个整数(-20000~-20999),表示动态异常的错误代码;sqlerrm 是字符串,表示动态异常的错误信息描述。

sqlcode||'  '||sqlerrm 表示将 sqlcode、'  '、sqlerrm 三者连接成为一个字符串而已。

6 楼

非常感谢!

我来回复

您尚未登录,请登录后再回复。点此登录或注册