Oracle存储过程和触发器基本操作解读文档格式.docx
《Oracle存储过程和触发器基本操作解读文档格式.docx》由会员分享,可在线阅读,更多相关《Oracle存储过程和触发器基本操作解读文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
前提表脚本:
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,'
王敏'
女'
INSERTINTOS_RZ0122(Sno,Sname,Ssex,Sage,Sdept)VALUES(0811104,'
张小红'
19,'
INSERTINTOS_RZ0122(Sno,Sname,Ssex,Sage,Sdept)VALUES(0821101,'
张立'
信息管理系'
INSERTINTOS_RZ0122(Sno,Sname,Ssex,Sage,Sdept)VALUES(0821102,'
吴宾'
INSERTINTOS_RZ0122(Sno,Sname,Ssex,Sage,Sdept)VALUES(0821103,'
张海'
INSERTINTOS_RZ0122(Sno,Sname,Ssex,Sage,Sdept)VALUES(0831101,'
钱小平'
通信工程系'
INSERTINTOS_RZ0122(Sno,Sname,Ssex,Sage,Sdept)VALUES(0831102,'
王大力'
INSERTINTOS_RZ0122(Sno,Sname,Ssex,Sage,Sdept)VALUES(0831103,'
张珊珊'
---增加课程信息脚本:
---
insertall
INSERTINTOC_RZ0122(Cno,Cname,Ccredit)VALUES('
C001'
高等数学'
4)
C002'
大学英语'
3)
C003'
C004'
计算机文化学'
2)
C005'
VB'
C006'
数据库基础'
C007'
数据结构'
C008'
计算机网络'
select*fromC_RZ0122;
---增加关联学生和课程信息脚本:
INSERTALL
INSERTINTOSC_RZ0122(Sno,Cno,Score)VALUES(0811101,'
96)
80)
84)
62)
INSERTINTOSC_RZ0122(Sno,Cno,Score)VALUES(0811102,'
92)
90)
INSERTINTOSC_RZ0122(Sno,Cno,Score)VALUES(0821102,'
76)
85)
73)
0)
INSERTINTOSC_RZ0122(Sno,Cno,Score)VALUES(0821103,'
50)
INSERTINTOSC_RZ0122(Sno,Cno,Score)VALUES(0831101,'
INSERTINTOSC_RZ0122(Sno,Cno,Score)VALUES(0831102,'
INSERTINTOSC_RZ0122(Sno,Cno,Score)VALUES(0831103,'
78)
65)
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说明有学生选了,则不能删除
于是新问题来了,看样子要把学生选课表也复制进来?
?
结果成了,真想去屎,,,这说明触发器创建的时候也不能穿透用户关系啊!
别人平时查询加上用户名前缀就行。
真想说,这错误截图要超过实验内容了,这说明了什么。