资源描述
数据库原理及应用实验报告 实验名称:存储过程 实验类型:验证型 实验环境:oracle 11g 指导教师:陈 骏 专业班级:信安1505班 姓 名: 学 号:512015 联系电话: 电子邮件: 实验地点:东6E501 实 验 日 期:2017年5月10日 实验报告日期:2017年5月11日成绩:_8一、实验目的(1)了解存储过程的概念、优点(2)熟练掌握创建存储过程的创建方法(3)熟练掌握存储过程的调用方法2、 实验平台Oracle 11g3、 实验步骤、出现的问题及解决方案(不能解决的将问题列出)(1) 实验步骤1)建立存储过程完成图书管理系统中的借书功能。 功能要求:l 借书时要求输入借阅流水号,借书证号,图书编号。(即该存储过程有3个输入参数)l 借书时,借书日期为系统时间。l 图书的是否借出改为是2)建立存储过程完成图书管理系统中的预约功能。l 预约时要求输入预约流水号,借书证号,ISBN。(即该存储过程有3个输入参数)l 存储过程先检查输入的ISBN版本的图书是否都已借出,如果是则进行预约,否则提示“该书目有可借图书,请查找”。l 预约时间为系统时间。3)建立存储过程完成图书管理系统中的还书功能。l 还书时要求输入借书证号,图书编号,罚款分类号(即该存储过程有3个输入参数)。l 还书日期为系统时间。l 图书的是否借出改为否。(2) 问题及解决方案1)问题一:步骤一无法执行原因:已创建的table中无“借书”项解决方案:将原代码中的“借书”改为“借阅”2) 问题二:步骤二中出现无法识别的符号原因:将英文分号误写为中文分号解决方案:修正为英文分号“;”4、 思考与总结(1) 书写存储语句时,应注意涉及的表格和属性名应与创建表格时相同(2) 注意区分中英文符号,避免出现符号无法识别以及程序没有结尾等错误(3) 注意空格的使用,避免出现缺少或多余的空格,造成语法错误5、 附:实验完整源代码1、CREATE OR REPLACE PROCEDURE PRO_借书功能(VAL_借阅流水号 IN 借阅.借阅流水号%TYPE,VAL_借书证号 IN 借阅.借书证号%TYPE,VAL_图书编号 IN 借阅.图书编号%TYPE)ASBEGININSERT 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)ASY_NUMBER BINARY_INTEGER;BEGINSELECT COUNT(*) INTO Y_NUMBER FROM 图书 WHERE 图书.ISBN=Y_ISBN AND 图书.是否借出=否;IF Y_NUMBER=0THENINSERT INTO 预约(预约流水号,借书证号,ISBN,预约时间)VALUES(Y_预约流水号,Y_借书证号,Y_ISBN,TO_CHAR(SYSDATE(),YYYY/MM/DD) ;DBMS_OUTPUT.put_line(可执行预约!);ELSEDBMS_OUTPUT.put_line(该书可借,请查找!);END IF;END;3、CREATE OR REPLACE PROCEDURE PRO_还书功能(VAL_借书证号 IN 借阅.借书证号%TYPE,VAL_图书编号 IN 借阅.图书编号%TYPE,VAL_罚款分类号 IN 借阅.罚款分类号%TYPE)ASVAL_TIME DATE;BEGINSELECT 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 联系电话:18281686860 电子邮件: 实验地点:东6E501 实 验 日 期:2017年5月10日 实验报告日期:2017年5月10日成绩:_一、实验目的(1)了解触发器的概念、优点(2)掌握触发器的方法和步骤(3)掌握触发器的使用4、 实验平台Oracle 11g5、 实验步骤、出现的问题及解决方案(不能解决的将问题列出)(3) 实验步骤1) 通过序列和触发器实现借阅表中借阅流水号字段的自动递增。2) 通过序列和触发器实现预约表中预约流水号字段的自动递增3) 修改实验三借书功能的存储过程。 该存储过程要求:l 借书时输入借书证号,图书编号。(即该函数有2个输入参数)l 借书时,借书日期为系统时间。 *该存储过程主体部分只有insert into语句。 4)建立与借书存储过程相对应的触发器,当借阅表中加入借阅信息时,该触发器触发,自动修改所借图书的是否借出改为是。5)修改实验三还书功能的存储过程。 该存储过程要求:l 还书时输入借书证号,图书编号。(即该函数有2个输入参数)l 还书时,还书日期为系统时间。 *该存储过程主体部分只有一条UPDATE语句。 6)建立与还书存储过程相对应的触发器,当借阅表中填入还书日期时,该触发器触发,自动修改所还图书的是否借出为否。(4) 问题及解决方案1) 问题一:步骤一中无法识别“seq_id”标识符原因:未创建seq_id序列解决方案:先创建该序列2)问题二:步骤3无法执行原因:已创建的table中无“借书”项解决方案:将原代码中的“借书”改为“借阅”3)问题三:步骤二中出现无法识别的符号原因:将英文分号误写为中文分号解决方案:修正为英文分号“;”4)问题四:原因:变量赋值过程中使用了错误的赋值语句解决方案:将bnum改为图书编号5、 思考与总结(4) 在创建trigger之前应先创建sequence,避免出现序列号无法识别的错误(5) 书写存储语句时,应注意涉及的表格和属性名应与创建表格时相同(6) 注意区分中英文符号,避免出现符号无法识别以及程序没有结尾等错误(7) 注意区别where和having的用法(8) 注意空格的使用,避免出现缺少或多余的空格,造成语法错误6、 附:实验源代码(1)create sequence seq_借阅start with 8increment by 1nomaxvaluenocyclenocache;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 8increment by 1nomaxvaluenocyclenocache;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)asv_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)asbegin 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 rowbegin if updating then update 图书 set 是否借出 = 否 where 图书编号 = :new.图书编号; end if;end;7
展开阅读全文