Oracle存储过程和触发器基本操作解读.docx
《Oracle存储过程和触发器基本操作解读.docx》由会员分享,可在线阅读,更多相关《Oracle存储过程和触发器基本操作解读.docx(14页珍藏版)》请在冰豆网上搜索。
Oracle存储过程和触发器基本操作解读
南华大学
计算机科学与技术学院
实验报告
(2012~2013学年度第二学期)
课程名称
Oracle高级数据库开发设计
实验名称
存储过程与触发器基本操作
姓名
学号
专业
班级
地点
教师
前提表脚本:
createtableS_RZ0122(
Snovarchar2(11)primarykey,
Snamevarchar2(20)notnull,
Ssexvarchar
(2)notnull,
Sagenumber
(2)notnull,
Sdeptvarchar(20)notnull
)
createtableC_RZ0122(
Cnovarchar2(20)primarykey,
Cnamevarchar2(20)notnull,
Ccreditnumber
(2)notnull
)
createtableSC_RZ0122(
Snovarchar2(11)notnull,
Cnovarchar2(20)notnull,
Scorenumber(3),
primarykey(Sno,Cno),
foreignkey(Sno)referencesS_RZ0122(Sno),
foreignkey(Cno)referencesC_RZ0122(Cno)
)
INSERTINTOS_RZ0122(Sno,Sname,Ssex,Sage,Sdept)VALUES(0811101,'李勇','男',21,'计算机系')
INSERTINTOS_RZ0122(Sno,Sname,Ssex,Sage,Sdept)VALUES(0811102,'刘晨','男',20,'计算机系')
INSERTINTOS_RZ0122(Sno,Sname,Ssex,Sage,Sdept)VALUES(0811103,'王敏','女',20,'计算机系')
INSERTINTOS_RZ0122(Sno,Sname,Ssex,Sage,Sdept)VALUES(0811104,'张小红','女',19,'计算机系')
INSERTINTOS_RZ0122(Sno,Sname,Ssex,Sage,Sdept)VALUES(0821101,'张立','男',20,'信息管理系')
INSERTINTOS_RZ0122(Sno,Sname,Ssex,Sage,Sdept)VALUES(0821102,'吴宾','女',19,'信息管理系')
INSERTINTOS_RZ0122(Sno,Sname,Ssex,Sage,Sdept)VALUES(0821103,'张海','男',20,'信息管理系')
INSERTINTOS_RZ0122(Sno,Sname,Ssex,Sage,Sdept)VALUES(0831101,'钱小平','女',21,'通信工程系')
INSERTINTOS_RZ0122(Sno,Sname,Ssex,Sage,Sdept)VALUES(0831102,'王大力','男',20,'通信工程系')
INSERTINTOS_RZ0122(Sno,Sname,Ssex,Sage,Sdept)VALUES(0831103,'张珊珊','女',19,'通信工程系')
---增加课程信息脚本:
---
insertall
INSERTINTOC_RZ0122(Cno,Cname,Ccredit)VALUES('C001','高等数学',4)
INSERTINTOC_RZ0122(Cno,Cname,Ccredit)VALUES('C002','大学英语',3)
INSERTINTOC_RZ0122(Cno,Cname,Ccredit)VALUES('C003','大学英语',3)
INSERTINTOC_RZ0122(Cno,Cname,Ccredit)VALUES('C004','计算机文化学',2)
INSERTINTOC_RZ0122(Cno,Cname,Ccredit)VALUES('C005','VB',2)
INSERTINTOC_RZ0122(Cno,Cname,Ccredit)VALUES('C006','数据库基础',4)
INSERTINTOC_RZ0122(Cno,Cname,Ccredit)VALUES('C007','数据结构',4)
INSERTINTOC_RZ0122(Cno,Cname,Ccredit)VALUES('C008','计算机网络',4)
select*fromC_RZ0122;
---增加关联学生和课程信息脚本:
---
INSERTALL
INSERTINTOSC_RZ0122(Sno,Cno,Score)VALUES(0811101,'C001',96)
INSERTINTOSC_RZ0122(Sno,Cno,Score)VALUES(0811101,'C002',80)
INSERTINTOSC_RZ0122(Sno,Cno,Score)VALUES(0811101,'C003',84)
INSERTINTOSC_RZ0122(Sno,Cno,Score)VALUES(0811101,'C005',62)
INSERTINTOSC_RZ0122(Sno,Cno,Score)VALUES(0811102,'C001',92)
INSERTINTOSC_RZ0122(Sno,Cno,Score)VALUES(0811102,'C002',90)
INSERTINTOSC_RZ0122(Sno,Cno,Score)VALUES(0811102,'C004',84)
INSERTINTOSC_RZ0122(Sno,Cno,Score)VALUES(0821102,'C001',76)
INSERTINTOSC_RZ0122(Sno,Cno,Score)VALUES(0821102,'C004',85)
INSERTINTOSC_RZ0122(Sno,Cno,Score)VALUES(0821102,'C005',73)
INSERTINTOSC_RZ0122(Sno,Cno,Score)VALUES(0821102,'C007',0)
INSERTINTOSC_RZ0122(Sno,Cno,Score)VALUES(0821103,'C001',50)
INSERTINTOSC_RZ0122(Sno,Cno,Score)VALUES(0821103,'C004',80)
INSERTINTOSC_RZ0122(Sno,Cno,Score)VALUES(0831101,'C001',50)
INSERTINTOSC_RZ0122(Sno,Cno,Score)VALUES(0831101,'C004',80)
INSERTINTOSC_RZ0122(Sno,Cno,Score)VALUES(0831102,'C007',0)
INSERTINTOSC_RZ0122(Sno,Cno,Score)VALUES(0831103,'C004',78)
INSERTINTOSC_RZ0122(Sno,Cno,Score)VALUES(0831103,'C005',65)
INSERTINTOSC_RZ0122(Sno,Cno,Score)VALUES(0831103,'C007',0)
selectSno,Cno,ScorefromSC_RZ0122;
一.实验题目
存储过程与触发器基本操作
二.实验要求
掌握对存储过程和触发器的创建、修改等基本操作。
3.实验步骤及过程
根据实验3创建的数据库及表,完成以下内容:
(1)在JXGL数据库中创建一存储过程并运行,从S表中查询所有女生的信息。
创建存储过程prWoman
执行存储过程prWoman
(2)在JXGL数据库中创建一存储过程并运行,从S表中根据学号查询并返回该学生的姓名和年龄。
创建存储过程
执行存储过程
(3)在JXGL数据库中创建一触发器,保证S表中学生的年龄在8-45岁之间。
触发器说明:
(触发器是特定事件出现的时候,自动执行的代码块。
类似于存储过程,触发器与存储过程的区别在于:
存储过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的。
)
首次创建出错:
错误在下面,因为SYS用户所属的表中不能创建触发器,所以先复制了一份表到SYSTEM用户中,
再创建触发器
测试:
(4)在JXGL数据库中创建一触发器,当有学生选了某门课时,不能从C表中删除
同样的,先复制C课程表
再复制学生选课表:
创建触发器:
测试:
成功
该课程。
4.实验总结
整个实验做下来困难重重啊!
因为这些平时使用的不是很多,所以用起来很生疏,特别是触发器的使用的更少,这还是从头开始学了。
Oracle也挺烦的,这么麻烦。
以下是遇见的部分错误与感受,重要的都记下了,方便以后查看。
1、创建存储过程出错
用showerror语句查看错误信息:
2、执行存储过程时报错:
查看当时创建存储过程的是输出顺序和选择顺序便知道了,Sage和Ssex反了
改了后执行,也不是,再XX。
。
。
其实原因是oracle不能直接这样显示多行数据,必须返回一个数据集,则改变语句后:
3、创建触发器报错:
解决办法:
再复制一份表到其他的用户下面,比如system
后来就可以了。
。
。
4、创建触发器2:
报错不能有子查询
解决办法:
统计SC学生选课表中该门课程的选课数目,如果选课数目大于0说明有学生选了,则不能删除
于是新问题来了,看样子要把学生选课表也复制进来?
?
?
结果成了,真想去屎,,,这说明触发器创建的时候也不能穿透用户关系啊!
别人平时查询加上用户名前缀就行。
。
。
真想说,这错误截图要超过实验内容了,这说明了什么。
。
。