数据库原理实验三_数据库原理第三次实验
数据库原理实验三由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“数据库原理第三次实验”。
数据库原理及应用实验报告
实验名称:存储过程 实验类型:验证型 实验环境:oracle 11g 指导教师:陈 骏 专业班级:信安1505班 姓
名:
学
号:512015 联系电话:电子邮件: 实验地点:东6E501 实 验 日 期: 2017年5月10日 实验报告日期:2017年 5月 11日
成绩:__________________________
一、实验目的(1)了解存储过程的概念、优点
(2)熟练掌握创建存储过程的创建方法(3)熟练掌握存储过程的调用方法
二、实验平台
Oracle 11g
三、实验步骤、出现的问题及解决方案(不能解决的将问题列出)(1)实验步骤
1)建立存储过程完成图书管理系统中的借书功能。
功能要求:
借书时要求输入借阅流水号,借书证号,图书编号。(即该存储过程有3个输入参数)
借书时,借书日期为系统时间。 图书的是否借出改为‘是’
2)建立存储过程完成图书管理系统中的预约功能。 预约时要求输入预约流水号,借书证号,ISBN。(即该存储过程有3个输入参数)
存储过程先检查输入的ISBN版本的图书是否都已借出,如果是则进行预约,否则提示“该书目有可借图书,请查找”。 预约时间为系统时间。
3)建立存储过程完成图书管理系统中的还书功能。
还书时要求输入借书证号,图书编号,罚款分类号(即该存储过程有3个输入参数)。
还书日期为系统时间。 图书的是否借出改为‘否’。
(2)问题及解决方案
1)问题一:步骤一无法执行
原因:已创建的table中无“借书”项
解决方案:将原代码中的“借书”改为“借阅” 2)问题二:步骤二中出现无法识别的符号 原因:将英文分号误写为中文分号
解决方案:修正为英文分号“;”
四、思考与总结
(1)书写存储语句时,应注意涉及的表格和属性名应与创建表格时相同(2)注意区分中英文符号,避免出现符号无法识别以及程序没有结尾等错误(3)注意空格的使用,避免出现缺少或多余的空格,造成语法错误
五、附:实验完整源代码
1、CREATE OR REPLACE PROCEDURE PRO_借书功能(VAL_借阅流水号 IN 借阅.借阅流水号%TYPE, VAL_借书证号 IN 借阅.借书证号%TYPE, VAL_图书编号 IN 借阅.图书编号%TYPE)AS BEGIN INSERT INTO 借阅(借阅流水号,借书证号,图书编号,借书日期)VALUES(VAL_借阅流水号,VAL_借书证号,VAL_图书编号,TO_CHAR(SYSDATE(),'YYYY/MM/DD'));UPDATE 图书 SET 是否借出='是' WHERE 图书.图书编号 =VAL_图书编号;DBMS_OUTPUT.PUT_LINE(' 本次借书操作完成!');END;
2、CREATE OR REPLACE PROCEDURE PRO_预约功能(Y_预约流水号 IN 预约.预约流水号%TYPE, Y_借书证号 IN 预约.借书证号%TYPE, Y_ISBN IN 图书.ISBN%TYPE)AS Y_NUMBER BINARY_INTEGER;BEGIN SELECT COUNT(*)INTO Y_NUMBER FROM 图书 WHERE 图书.ISBN=Y_ISBN AND 图书.是否借出='否';IF Y_NUMBER=0 THEN INSERT INTO 预约(预约流水号,借书证号,ISBN,预约时间)VALUES(Y_预约流水号,Y_借书证号,Y_ISBN,TO_CHAR(SYSDATE(),'YYYY/MM/DD'));DBMS_OUTPUT.put_line('可执行预约!');ELSE DBMS_OUTPUT.put_line('该书可借,请查找!');END IF;END;
3、CREATE OR REPLACE PROCEDURE PRO_还书功能(VAL_借书证号 IN 借阅.借书证号%TYPE, VAL_图书编号 IN 借阅.图书编号%TYPE, 4 VAL_罚款分类号 IN 借阅.罚款分类号%TYPE)AS VAL_TIME DATE;BEGIN SELECT SYSDATE INTO VAL_TIME FROM DUAL;UPDATE 借阅 SET 归还日期=VAL_TIME WHERE 借书证号 =VAL_借书证号 AND 借阅.图书编号=VAL_图书编号;UPDATE 图书 SET 是否借出='否' WHERE 图书.图书编号 =VAL_图书编号;UPDATE 借阅 SET 罚款分类号=VAL_罚款分类号 WHERE 借书证号 =VAL_借书证号 AND 借阅.图书编号=VAL_图书编号;DBMS_OUTPUT.PUT_LINE(' 本次还书操作完成!END;
');
数据库原理及应用实验报告
实验名称:触发器 实验类型:验证型 实验环境:oracle 11g 指导教师:陈 骏 专业班级:信安1505班 姓
名:李 维 学
号:5120155364 联系电话:*** 电子邮件: 实验地点:东6E501 实 验 日 期: 2017年5月10日实验报告日期:2017年 5月 10日
成绩:__________________________
一、实验目的(1)了解触发器的概念、优点(2)掌握触发器的方法和步骤(3)掌握触发器的使用
四、实验平台
Oracle 11g
五、实验步骤、出现的问题及解决方案(不能解决的将问题列出)(3)实验步骤
1)通过序列和触发器实现借阅表中借阅流水号字段的自动递增。
2)通过序列和触发器实现预约表中预约流水号字段的自动递增
3)修改实验三借书功能的存储过程。
该存储过程要求: 借书时输入借书证号,图书编号。(即该函数有2个输入参数)
借书时,借书日期为系统时间。
*该存储过程主体部分只有insert into语句。
4)建立与借书存储过程相对应的触发器,当借阅表中加入借阅信息时,该触发器触发,自动修改所借图书的是否借出改为‘是’。
5)修改实验三还书功能的存储过程。
该存储过程要求:
还书时输入借书证号,图书编号。(即该函数有2个输入参数) 还书时,还书日期为系统时间。
*该存储过程主体部分只有一条UPDATE语句。
6)建立与还书存储过程相对应的触发器,当借阅表中填入还书日期时,该触发器触发,自动修改所还图书的是否借出为‘否’。
2(4)问题及解决方案
1)问题一:步骤一中无法识别“seq_id”标识符 原因:未创建seq_id序列 解决方案:先创建该序列
2)问题二:步骤3无法执行
原因:已创建的table中无“借书”项
解决方案:将原代码中的“借书”改为“借阅” 3)问题三:步骤二中出现无法识别的符号 原因:将英文分号误写为中文分号 解决方案:修正为英文分号“;” 4)问题四:
原因:变量赋值过程中使用了错误的赋值语句 解决方案:将bnum改为图书编号
五、思考与总结
(4)在创建trigger之前应先创建sequence,避免出现序列号无法识别的错误(5)书写存储语句时,应注意涉及的表格和属性名应与创建表格时相同(6)注意区分中英文符号,避免出现符号无法识别以及程序没有结尾等错误(7)注意区别where和having的用法
(8)注意空格的使用,避免出现缺少或多余的空格,造成语法错误
六、附:实验源代码
(1)create sequence seq_借阅 start with 8 increment by 1 nomaxvalue nocycle nocache;create or replace trigger tr_借阅流水号 before insert on 借阅 for each row
begin
select seq_借阅.nextval into :new.借阅流水号 from dual;
end;
(2)create sequence seq_预约 start with 8 increment by 1 nomaxvalue nocycle nocache;create or replace trigger tr_预约流水号 before insert on 预约 for each row
begin
select seq_预约.nextval into :new.预约流水号 from dual;
end;
(3)create or replace procedure p_borrow_book_xg(p_jszh in number,p_tsbh in number)as v_sfjc 图书.是否借出%type;begin
select 是否借出 into v_sfjc from 图书 where 图书编号=p_tsbh;
if v_sfjc='否' then
insert into 借阅(借书证号,图书编号,借书日期)
values(p_jszh,p_tsbh,to_date(to_char(sysdate,'YYYY/MM/DD'),'YYYY/MM/DD'));
--update 图书 set 是否借出='是' where 图书编号=p_tsbh;
commit;
else
dbms_output.put_line('该图书已经借出!');
end if;end;(4)create or replace trigger tr_借书 before insert on 借阅 for each row
begin
if inserting then
update 图书 set 是否借出='是' where 图书编号=:new.图书编号;
select seq_借阅.nextval into :new.借阅流水号 from dual;
end if;
end;(5)create or replace procedure p_return_图书(p_借书证号 in number,p_图书编号 in number)as begin
update 借阅 set 归还日期=to_date(to_char(sysdate,'YYYY/MM/DD'),'YYYY/MM/DD'),罚款分类号=p_罚款分类号 where 借书证号=p_借书证号 and 图书编号=p_图书编号;
update 图书 set 是否借出='否' where 图书编号=p_图书编号;
commit;
end;(6)create or replace trigger tr_还书
after update
on 借阅
for each row begin
if updating then
update 图书 set 是否借出 = '否' where 图书编号 = :new.图书编号;
end if;end;