1、南华大学计 算 机 科 学 与 技 术 学 院实 验 报 告 ( 20122013 学年度 第二学期 )课程名称 Oracle 高级数据库开发设计实验名称 存储过程与触发器基本操作姓名 学号专业 班级地点 教师前提表脚本:create table S_RZ0122 (Sno varchar2(11) primary key,Sname varchar2(20) not null,Ssex varchar(2) not null ,Sage number(2) not null,Sdept varchar(20) not null)create table C_RZ0122(Cno varcha
2、r2(20) primary key,Cname varchar2(20) not null ,Ccredit number(2) not null)create table SC_RZ0122(Sno varchar2(11) not null,Cno varchar2(20) not null,Score number(3) ,primary key(Sno ,Cno),foreign key(Sno) references S_RZ0122(Sno),foreign key(Cno) references C_RZ0122(Cno)INSERT INTO S_RZ0122 (Sno ,S
3、name,Ssex,Sage ,Sdept) VALUES(0811101,李勇,男,21,计算机系)INSERT INTO S_RZ0122 (Sno ,Sname,Ssex,Sage ,Sdept) VALUES(0811102,刘晨,男,20,计算机系)INSERT INTO S_RZ0122 (Sno ,Sname,Ssex,Sage ,Sdept) VALUES(0811103,王敏,女,20,计算机系)INSERT INTO S_RZ0122 (Sno ,Sname,Ssex,Sage ,Sdept) VALUES(0811104,张小红,女,19,计算机系)INSERT INTO
4、 S_RZ0122 (Sno ,Sname,Ssex,Sage ,Sdept) VALUES(0821101,张立,男,20,信息管理系)INSERT INTO S_RZ0122 (Sno ,Sname,Ssex,Sage ,Sdept) VALUES(0821102,吴宾,女,19,信息管理系)INSERT INTO S_RZ0122 (Sno ,Sname,Ssex,Sage ,Sdept) VALUES(0821103,张海,男,20,信息管理系)INSERT INTO S_RZ0122 (Sno ,Sname,Ssex,Sage ,Sdept) VALUES(0831101,钱小平,女
5、,21,通信工程系)INSERT INTO S_RZ0122 (Sno ,Sname,Ssex,Sage ,Sdept) VALUES(0831102,王大力,男,20,通信工程系)INSERT INTO S_RZ0122 (Sno ,Sname,Ssex,Sage ,Sdept) VALUES(0831103,张珊珊,女,19,通信工程系)-增加课程信息脚本:-insert allINSERT INTO C_RZ0122 (Cno ,Cname ,Ccredit ) VALUES (C001,高等数学,4)INSERT INTO C_RZ0122 (Cno ,Cname ,Ccredit )
6、 VALUES (C002,大学英语,3)INSERT INTO C_RZ0122 (Cno ,Cname ,Ccredit ) VALUES (C003,大学英语,3)INSERT INTO C_RZ0122 (Cno ,Cname ,Ccredit ) VALUES (C004,计算机文化学,2)INSERT INTO C_RZ0122 (Cno ,Cname ,Ccredit ) VALUES (C005,VB,2)INSERT INTO C_RZ0122 (Cno ,Cname ,Ccredit ) VALUES (C006,数据库基础,4)INSERT INTO C_RZ0122 (
7、Cno ,Cname ,Ccredit ) VALUES (C007,数据结构,4)INSERT INTO C_RZ0122 (Cno ,Cname ,Ccredit ) VALUES (C008,计算机网络,4)select * from C_RZ0122;-增加关联学生和课程信息脚本:-INSERT ALLINSERT INTO SC_RZ0122(Sno,Cno,Score) VALUES (0811101,C001,96)INSERT INTO SC_RZ0122(Sno,Cno,Score) VALUES (0811101,C002,80)INSERT INTO SC_RZ0122(
8、Sno,Cno,Score) VALUES (0811101,C003,84)INSERT INTO SC_RZ0122(Sno,Cno,Score) VALUES (0811101,C005,62)INSERT INTO SC_RZ0122(Sno,Cno,Score) VALUES (0811102,C001,92)INSERT INTO SC_RZ0122(Sno,Cno,Score) VALUES (0811102,C002,90)INSERT INTO SC_RZ0122(Sno,Cno,Score) VALUES (0811102,C004,84)INSERT INTO SC_RZ
9、0122(Sno,Cno,Score) VALUES (0821102,C001,76)INSERT INTO SC_RZ0122(Sno,Cno,Score) VALUES (0821102,C004,85)INSERT INTO SC_RZ0122(Sno,Cno,Score) VALUES (0821102,C005,73)INSERT INTO SC_RZ0122(Sno,Cno,Score) VALUES (0821102,C007,0)INSERT INTO SC_RZ0122(Sno,Cno,Score) VALUES (0821103,C001,50)INSERT INTO S
10、C_RZ0122(Sno,Cno,Score) VALUES (0821103,C004,80)INSERT INTO SC_RZ0122(Sno,Cno,Score) VALUES (0831101,C001,50)INSERT INTO SC_RZ0122(Sno,Cno,Score) VALUES (0831101,C004,80)INSERT INTO SC_RZ0122(Sno,Cno,Score) VALUES (0831102,C007,0)INSERT INTO SC_RZ0122(Sno,Cno,Score) VALUES (0831103,C004,78)INSERT IN
11、TO SC_RZ0122(Sno,Cno,Score) VALUES (0831103,C005,65)INSERT INTO SC_RZ0122(Sno,Cno,Score) VALUES (0831103,C007,0)select Sno,Cno,Score from SC_RZ0122;一 实验题目 存储过程与触发器基本操作 二 实验要求 掌握对存储过程和触发器的创建、修改等基本操作。3 实验步骤及过程 根据实验 3 创建的数据库及表,完成以下内容: (1) 在 JXGL 数据库中创建一存储过程并运行,从 S 表中查询所有女生的信息。 创建存储过程 prWoman执行存储过程 prWo
12、man(2) 在 JXGL 数据库中创建一存储过程并运行,从 S 表中根据学号查询并返回该学生的姓名和年龄。 创建存储过程执行存储过程(3) 在 JXGL 数据库中创建一触发器,保证 S 表中学生的年龄在 8-45 岁之间。 触发器说明:(触发器是特定事件出现的时候,自动执行的代码块。类似于存储过程,触发器与存储过程的区别在于:存储过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的。 )首次创建出错:错误在下面,因为 SYS 用户所属的表中不能创建触发器,所以先复制了一份表到 SYSTEM 用户中,再创建触发器测试:(4) 在 JXGL 数据库中创建一触发器,当有学生选了某门课时,不
13、能从 C 表中删除 同样的,先复制 C 课程表再复制学生选课表:创建触发器:测试:成功该课程。 4 实验总结整个实验做下来困难重重啊!因为这些平时使用的不是很多,所以用起来很生疏,特别是触发器的使用的更少,这还是从头开始学了。Oracle 也挺烦的,这么麻烦。以下是遇见的部分错误与感受,重要的都记下了,方便以后查看。1、创建存储过程出错用 show error 语句查看错误信息:2、执行存储过程时报错:查看当时创建存储过程的是输出顺序和选择顺序便知道了,Sage 和Ssex 反了改了后执行,也不是,再百度。 。 。其实原因是 oracle 不能直接这样显示多行数据,必须返回一个数据集,则改变语句后:3、创建触发器报错:解决办法:再复制一份表到其他的用户下面,比如 system后来就可以了。 。 。4、创建触发器 2:报错不能有子查询解决办法:统计 SC 学生选课表中该门课程的选课数目,如果选课数目大于 0 说明有学生选了,则不能删除于是新问题来了,看样子要把学生选课表也复制进来?结果成了,真想去屎, , ,这说明触发器创建的时候也不能穿透用户关系啊!别人平时查询加上用户名前缀就行。 。 。真想说,这错误截图要超过实验内容了,这说明了什么。 。 。