西南科技大学数据库实验三(Oracle 11g)

/*
*实验三 存储过程与触发器
*时间:2019-11-25
*联系:2838215550@qq.com
*附言:把代码写成一首诗。
*/
1、建立存储过程完成图书管理系统中的借书功能,并调用该存储过程实现借书功能。
  功能要求:
借书时要求输入借阅流水号,借书证号,图书编号。(即该存储过程有3个输入参数)
借书时,借书日期为系统时间。
图书的是否借出改为“是”。
调用存储过程实现借书证号“20051001”借出图书编号为“1005050”的图书。
create or replace procedure PR_借书 
(
v_借阅流水号 in 借阅.借阅流水号%type,
v_借书证号 in 借阅.借书证号%type,
v_图书编号 in 借阅.图书编号%type
)
as
begin
  insert into 借阅 values(v_借阅流水号,v_借书证号,v_图书编号,sysdate,null,null,null);
  update 图书 set 图书.是否借出='是' where 图书.图书编号=v_图书编号;
end;

call PR_借书(7,20051001,1005050);
--调用完成。
exec PR_借书(8,20051001,1005050);
--PL/SQL 过程已成功完成。
       

2、建立存储过程完成图书管理系统中的预约功能。
预约时要求输入预约流水号,借书证号,ISBN。(即该存储过程有3个输入参数)
存储过程先检查输入的ISBN版本的图书是否都已借出,如果是则进行预约,否则提示“该书目有可借图书,请查找”。
预约时间为系统时间。
调用存储过程实现借书证号“20081237”预约ISBN为“9787508040110”的图书。

create or replace procedure PR_预约
(
v_预约流水号 in 预约.预约流水号%type,
v_借书证号 in 预约.借书证号%type,
v_ISBN in 预约.ISBN%type
)
as
v_数量 number;
begin
  select count(*) into v_数量 from 图书 where 图书.ISBN=v_ISBN and 图书.是否借出='否';
  if v_数量=0 then
    insert into 预约 values(v_预约流水号,v_借书证号,v_ISBN,sysdate);
    commit;
  else
    dbms_output.put_line('该书目有可借图书,请查找!');
  end if;
end;

call PR_预约(2,20081237,9787508040110);


3、建立存储过程完成图书管理系统中的还书功能。
还书时要求输入借书证号,图书编号,罚款分类号(即该存储过程有3个输入参数)。
还书日期为系统时间。
图书的是否借出改为‘否’。
调用存储过程实现借书证号“20051001”归还图书编号为“1005050”的图书。

create or replace procedure PR_还书
(
v_借书证号 借阅.借书证号%type,
v_图书编号 借阅.图书编号%type,
v_罚款分类号 借阅.罚款分类号%type
)
as
begin
  update 借阅 set 借阅.归还日期=sysdate,借阅.罚款分类号=v_罚款分类号 where 借阅.借书证号=v_借书证号 and 借阅.图书编号=v_图书编号;
  update 图书 set 图书.是否借出='否' where 图书.图书编号=v_图书编号;
end;

call PR_还书(20051001,1005050,null);

4、通过序列和触发器实现借阅表中借阅流水号字段的自动递增。

create sequence SEQ_序列
minvalue 1
maxvalue 1.0E28
start with 1
increment by 1
cache 20;

create or replace trigger TR_借阅流水号自增 before insert on 借阅 for each row
begin
  select SEQ_序列.nextval into :new.借阅流水号 from dual;
end;


5、修改借书功能的存储过程。
   该存储过程要求:
  (1)借书时输入借书证号,图书编号。(即该函数有2个输入参数)
  (2)借书时,借书日期为系统时间。
       *该存储过程主体部分只有insert into语句。

create or replace procedure PR_借书 
(
v_借书证号 in 借阅.借书证号%type,
v_图书编号 in 借阅.图书编号%type
)
as
v_是否借出 图书.是否借出%type;
begin
  select 图书.是否借出 into v_是否借出 from 图书 where 图书.图书编号=v_图书编号;
  if v_是否借出='否' then
    insert into 借阅(借书证号,图书编号,借书日期) values(v_借书证号,v_图书编号,sysdate);
    update 图书 set 图书.是否借出='是' where 图书.图书编号=v_图书编号;
    commit;
  else
    dbms_output.put_line('该书已经被借走了!');
  end if;
end;       
       

6、建立与借书存储过程相对应的触发器,当借阅表中加入借阅信息时,该触发器触发,自动修改所借图书的是否借出改为‘是’。

create or replace trigger TR_借书 after insert on 借阅 for each row
begin
  update 图书 set 图书.是否借出='是' where 图书.图书编号=:new.图书编号;
end;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值