安工大数据库系统概论实验报告_第1页
安工大数据库系统概论实验报告_第2页
安工大数据库系统概论实验报告_第3页
安工大数据库系统概论实验报告_第4页
安工大数据库系统概论实验报告_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Oracle9i上机操作指南 安徽工业大学计算机学院各表的数据结构和数据如下: 1 学生情况表 Student 主关键字:SNO 非空字段:SNAME,SDEPT,SCLASS CS:计算机系SNO(C,5)学号SNAME(C,10)姓名SDEPT(C,2)系SCLASS(C,2)班级SSEX(C,2)性别SAGE(N,2)年龄 96001 马小燕 CS 01 女 21MA:数学系IS:信息系 96002 黎明 CS 01 男 18 96003 刘东明 MA 01 男 18 96004 赵志勇 IS 02 男注意:区别大小写 20 97001 马蓉 MA 02 女 19 97002 李成功 C

2、S 01 男 20 97003 黎明 IS 03 女 19 97004 李丽 CS 02 女 19 96005 司马志明 CS 02 男 18 2 课程名称表 Course 3 教师授课表 Teach CNO(C,3)课程号CNAME(C,16)课程名称CTIME(N,3)学时数TNAME(C,8)教师姓名TSEX(C,2)性别CNO(C,3)课程号TDATE授课日期TDEPT(C,2)系 001 数学分析 144 王成刚男 004 1999.9.5 CS 002 普通物理 144 李正科男 003 1999.9.5 CS 003 微机原理 72 严敏女 001 1999.9.5 MA 004

3、 数据结构 72 赵高男 004 1999.9.5 IS 005 操作系统 64 李正科男 003 2000.2.23 MA 006 数据库原理 64 刘玉兰女 006 2000.2.23 CS 007 DB_Design 48 王成刚男 004 2000.2.23 IS 008 程序设计 56 马悦女 008 2000.9.6 CS 王成刚男 007 1999.9.5 CS 主关键字:CNO 候选关键字:CNAME 主关键字:TNAME,CNO,TDEPT 参照关系:Course(CNO) 4 成绩表 Score 主关键字:SNO,CNO 参照关系:Student(SNO),Course(C

4、NO) SNO(C,5)学号CNO(C,3)课程号SCORE(N,5,2)分数SNO(C,5)学号CNO(C,3)课程号SCORE(N,5,2)分数SNO(C,5)学号CNO(C,3)课程号SCORE(N,5,2)分数 96001 001 77.5 96005 005 90 97002 003 91 96001 003 89 96005 006 89 97002 004 96001 004 86 96005 007 76 97002 006 92 96001 005 82 96003 001 69 97004 005 90 96002 001 88 97001 001 96 97004 006

5、 85 96002 003 92.5 97001 008 9597004 008 75 96002 006 90 96004 001 8797003 001 59 96005 004 92 96003 003 9197003 003 58 实验一:数据定义语言 实验目的 熟悉Oracle上机环境及Oracle客户端的配置;熟练掌握和使用DDL语言,建立、修改和删除数据库表、主键、外键约束关系和索引。 实验要求 熟悉Oracle上机环境,掌握Oracle客户端的配置; 建立数据库表,修改数据库表结构,建立、删除索引; 实验内容 1 SQL数据定义语句: 例1-1: (建立数据库表) 建立教学数据

6、库的四个数据库表,其中Student表中不包含SSEX(C,2) 字段,Sname 字段为Sname(C,8)且可为空。 例1-2: (修改数据库表) 在Student表中增加SEX(C,2) 字段。ALTER TABLE STUDENTADD SEX CHAR(2) CHECK(SEX IN ('男','女') 例1-3: (修改列名) 将Student表中列名SEX修改为SSEX。ALTER TABLE STUDENTDROP COLUMN SEX ALTER TABLE STUDENTADD SSEX CHAR(2) CHECK(SEX IN ('

7、男','女') 例1-4: (修改数据库表) 将Student表中把Sname 字段修改为Sname(C,10)且为非空。ALTER TABLE STUDENT MODIFY (SNAME VARCHAR2(10) 例1-5: (建立索引) 为Score表按课程号升序、分数降序建立索引,索引名为SC_GRADE。CREATE INDEX SC_GRADE ON SCORE(CNO,GRADE DESC) 例1-6: (删除索引) 删除索引SC_GRADE。DROP INDEX SC_GRADE 例1-7: (建立数据库表) 建立数据库表S1(SNO,SNAME,SD,S

8、A),其字段类型定义与Student表中的相应字段(SNO,SNAME,SDEPT,SAGE)的数据类型定义相同。 例1-8: (修改数据库表) 删除成绩表Score的参照完整性约束关系。 例1-9: (修改数据库表) 添加成绩表Score的参照完整性约束关系。 例1-10: (修改数据库表名) 将数据库表S1改名为Student_Temp。实验二:数据操纵语言 实验目的 在实验一的基础上,熟练掌握和使用DML语言,对数据进行增加、修改和删除操作。 实验要求 对数据库表进行插入、修改和删除数据的操作。 实验内容 2 SQL数据操纵语句: 例2-1: (插入数据) 按前面各表中的数据分别插入到教

9、学数据库的四个数据库表中。插完后的显示结果截图插完后的显示结果截图 例2-2:(多行插入) 将表Student中在计算机系(CS)的学生数据插入到表Student_Temp中。(以上操作中,注意用COMMIT提交数据,将数据保存到数据库服务器) 例2-3:(利用查询来实现表的定义与数据插入) 求每一个学生的平均成绩,把结果存入数据库表Student_Gr中。 例2-4: (修改数据) 将Student_Temp表中所有学生的年龄加2。 执行UPDATE STUDENT_TEMP SET SA=SA+2;的前后比较: 例2-5: (修改数据) 将Course表中程序设计课时数修改成与数据结构的课

10、时数相同。UPDATE COURSESET CTIME=(SELECT CTIME FROM COURSE WHERE CNAME='数据结构')WHERE CNAME='程序设计' 执行完此语句后的结果如下: 例2-6: (插入数据) 向Score表中插入数据(98001, 001, 95),根据返回信息解释其原因。INSERT INTO SCORE VALUES('98001','001',95);因为SCORE表的外键SC_FK1是STUDENT表中的SNO,而STUDENT表中没有学号为98001的学生,所以不能插入。 例

11、2-7: (插入数据) 向Score表中插入数据(97001, 010, 80),根据返回信息解释其原因。INSERT INTO SCORE VALUES('97001','010',80);因为SCORE表的外键SC_FK2是COURSE表中的CNO,而COURSE表中没有课程号为010的课程,所以不能插入。例2-8: (删除数据) 删除Student表中学号为96001的学生信息,根据返回信息解释其原因。DELETE FROM STUDENT WHERE SNO='96001'因为在定义完整性约束条件时,没有写ON DELETE CASECA

12、DE选项,则默认为 ON DELETE RESTRICTED,此选项表示如果父表中的行在子表中引用,则它不能被删除,由于STUDENT表中的SNO在SCORE表中被引用,所以不允许删除。例2-9: (删除数据) 删除Course表中课程号为003 的课程信息,根据返回信息解释其原因。DELETE FROM COURSE WHERE CNO='003'因为在定义完整性约束条件时,没有写ON DELETE CASECADE选项,则默认为 ON DELETE RESTRICTED,此选项表示如果父表中的行在子表中引用,则它不能被删除,由于COURSE表中的CNO在SCORE表中被引用

13、,所以不允许删除。 例2-10: (删除数据) 删除学生表Student_Temp中学号以96打头的学生信息。DELETE FROM STUDENT_TEMP WHERE SNO LIKE '96%' 例2-11: (删除数据) 删除数据库表Student_Temp中所有学生的数据。DELETE FROM STUDENT_TEMP; 执行完此语句后再次查询,无数据证明表中数据已被删除,显示如下: 例2-12:(删除表) 删除数据库表Student_Temp和Student_Gr。DROP TABLE STUDENT_TEMP;DROP TABLE STUDENT_GR;实验三:

14、数据查询语言 实验目的 体会SQL语言数据查询功能的丰富和复杂。 实验要求 对数据库表进行各种查询操作。 实验内容 3 SQL数据查询语句: 例3-1: (选择表中的若干列) 求全体学生的学号、姓名、性别和年龄。SELECT SNO,SNAME,SSEX,SAGE FROM STUDENT; 例3-2: (不选择重复行) 求选修了课程的学生学号。SELECT DISTINCT SNO FROM SCORE; 例3-3: (选择表中的所有列) 求全体学生的详细信息。SELECT *FROM STUDENT; 例3-4: (使用表达式) 求全体学生的学号、姓名和出生年份。SELECT SNO,SN

15、AME,2012-SAGE FROM STUDENT; 例3-5: (使用列的别名) 求学生的学号和出生年份,显示时使用别名“学号”和“出生年份”。SELECT SNO AS "学号",2012-SAGE AS "出生年份" FROM STUDENT; 例3-6: (比较大小条件) 求年龄大于19岁的学生的姓名和年龄。SELECT SNAME,SAGE FROM STUDENT WHERE SAGE>19; 例3-7: (比较大小条件) 求计算机系或信息系年龄大于18岁的学生的姓名、系和年龄。SELECT SNAME,SDEPT,SAGE FROM

16、 STUDENTWHERE SDEPT='CS' OR SDEPT='IS'AND SAGE>18; 例3-8: (确定范围条件) 求年龄在19岁与22岁(含20岁和22岁)之间的学生的学号和年龄。SELECT SNO,SAGE FROM STUDENTWHERE SAGE BETWEEN 20 AND 22; 例3-9: (确定范围条件) 求年龄不在19岁与22岁之间的学生的学号和年龄。SELECT SNO,SAGE FROM STUDENTWHERE SAGE NOT BETWEEN 19 AND 22; 例3-10:(确定集合条件) 求在下列各系的学

17、生信息:数学系、计算机系。SELECT *FROM STUDENT WHERE SDEPT IN('CS','MA'); 例3-11:(确定集合条件) 求不是数学系、计算机系的学生信息。SELECT *FROM STUDENT WHERE SDEPT NOT IN('CS','MA'); 例3-12:(匹配查询) 求姓名是以“李”打头的学生。SELECT *FROM STUDENT WHERE SNAME LIKE '李%' 例3-13:(匹配查询) 求姓名中含有“志”的学生。SELECT *FROM STUDEN

18、T WHERE SNAME LIKE '%志%' 例3-14:(匹配查询) 求姓名长度至少是三个汉字且倒数第三个汉字必须是“马”的学生。SELECT *FROM STUDENT WHERE SNAME LIKE '%马_' 例3-15:(匹配查询) 求选修课程001或003,成绩在80至90之间,学号为96xxx的学生的学号、课程号和成绩。SELECT SNO,CNO,SCORE FROM SCORE WHERE CNO IN('001','003') AND SCORE BETWEEN 80 AND 90 AND SNO LIK

19、E '96%' 例3-16:(匹配查询) 求课程名中包含 _ 字符的课程号、课程名和学时数。SELECT CNO,CNAME,CTIME FROM COURSE WHERE CNAME LIKE '%_%'ESCAPE '' 例3-17:(涉及空值查询) 求缺少学习成绩的学生的学号和课程号。SELECT SNO,CNO FROM SCOREWHERE SCORE IS NULL; 例3-18:(控制行的显示顺序) 求选修003课程或004课程的学生的学号、课程号和分数,要求按课程号升序、分数降序的顺序显示结果。SELECT SNO,CNO,SCO

20、RE FROM SCOREWHERE CNO IN('003','004')ORDER BY CNO ASC,SCORE DESC; 例3-19:(组函数) 求学生总人数。SELECT COUNT(SNO) FROM STUDENT; 例3-20:(组函数) 求选修了课程的学生人数。SELECT COUNT(DISTINCT SNO) FROM SCORE; 例3-21:(组函数) 求计算机系学生的平均年龄。SELECT AVG(SAGE) FROM STUDENTWHERE SDEPT='CS' 例3-22:(组函数) 求选修了课程001的最高

21、、最低与平均成绩。SELECT MAX(SCORE),MIN(SCORE),AVG(SCORE) FROM SCOREWHERE CNO='001' 例3-23:(分组查询) 求各门课程的平均成绩与总成绩。SELECT CNO,AVG(SCORE),SUM(SCORE) FROM SCOREGROUP BY CNO; 例3-24:(分组查询) 求各系、各班级的人数和平均年龄。SELECT SDEPT,COUNT(SNO),AVG(SAGE) FROM STUDENT GROUP BY SDEPT;SELECT SCLASS,COUNT(SNO),AVG(SAGE) FROM S

22、TUDENT GROUP BY SCLASS; 例3-25:(分组查询) 输入以下查询语句并执行,观察出现的其结果并分析其原因。 SELECT SNAME,SDEPT,COUNT(*)FROM STUDENT WHERE SDEPT=CS GROUP BY SDEPT;在包含GROUP BY子句的查询语句中,SELECT子句后面的所有字段列表(除组函数外),均应该包含在GROUP BY 子句中,即所选项与分组的一致性,而此语句SELECT后的选项并未全被包括在GROUP BY 语句后,所以会出现错误。改正的: 例3-26:(分组查询) 分析以下语句为什么会出现错误。并给出正确的查询语句。 SE

23、LECT SAGE FROM STUDENT GROUP BY SNO;如果使用GROUP BY 语句,必须保证所选项与分组项的一致性,而此语句GROUP BY语句后出现的SNO并未在SELECT中出现,违反了一致性规则,所以错误。确的查询语句: SELECT SAGE FROM STUDENT GROUP BY SAGE; 例3-27:(分组查询) 求学生人数不足3人的系及其相应的学生数。 SELECT SDEPT,COUNT(SNO) FROM STUDENTGROUP BY SDEPTHAVING COUNT(SNO)<3; 例3-28:(分组查询) 求各系中除01班之外的各班的学

24、生人数。 SELECT SCLASS,COUNT(SNO) FROM STUDENTWHERE SCLASS NOT IN ('001')GROUP BY SCLASS; 例3-29:(涉及空值的查询) 分别观察各组函数、行的显示顺序以及分组查询与空值的关系。 SELECT *FROM SCORE; 按学号,课程号分组查询: 例3-30:(连接查询) 求选修了课程001且成绩在70分以下或成绩在90分以上的学生的姓名、课程名称和成绩。 SELECT SNAME,CNAME,SCORE FROM STUDENT,COURSE,SCOREWHERE STUDENT.SNO=SCOR

25、E.SNO AND COURSE.CNO=SCORE.CNOAND COURSE.CNO='001'AND SCORE.SCORE NOT BETWEEN 70 AND 90; 例3-31:(连接查询与表的别名) 求选修了课程的学生的学生姓名、课程号和成绩。 SELECT SNAME,CNO,SCORE FROM STUDENT,SCOREWHERE STUDENT.SNO=SCORE.SNOAND SCORE.CNO IS NOT NULL; 例3-32:(自身连接查询) 求年龄大于 李丽 的所有学生的姓名、系和年龄。 SELECT SNAME,SDEPT,SAGE FROM

26、 STUDENTWHERE SAGE>(SELECT SAGE FROM STUDENT WHERE SNAME='李丽');例3-33:(外部连接查询) 求选修了课程002或003的学生的学号、课程号、课程名和成绩,要求必须将002和003课程的相关信息显示出来。 SELECT SNO,CNO,CNAME,SCORE FROM COURSE,SCOREWHERE COURSE.CNO=SCORE.CNO(+)AND COURSE.CNO IN('002','003'); 例3-34:(子查询) 求与 黎明 年龄相同的学生的姓名和系。 SE

27、LECT SNAME,SDEPT FROM STUDENT WHERE SAGE IN (SELECT SAGE FROM STUDENT WHERE SNAME='黎明'); 例3-35:(子查询) 求选修了课程名为 数据结构 的学生的学号和姓名。 SELECT STUDENT.SNO,STUDENT.SNAME FROM STUDENT,COURSE,SCOREWHERE STUDENT.SNO=SCORE.SNO AND COURSE.CNO=SCORE.CNOAND SCORE.CNO IN (SELECT CNO FROM COURSE WHERE CNAME=

28、9;数据结构'); 例3-36:(子查询ANY) 求比数学系中某一学生年龄大的学生的姓名和系。 SELECT SNAME,SDEPT FROM STUDENTWHERE SAGE>ANY(SELECT SAGE FROM STUDENT WHERE SDEPT='MA'); 例3-37:(子查询ALL) 求比数学系中全体学生年龄大的学生的姓名和系。 SELECT SNAME,SDEPT FROM STUDENTWHERE SAGE>ALL(SELECT SAGE FROM STUDENT WHERE SDEPT='MA'); 例3-38:(子

29、查询EXISTS) 求选修了课程004的学生的姓名和系。SELECT SNAME,SDEPT FROM STUDENTWHERE EXISTS (SELECT *FROM SCORE WHERE STUDENT.SNO=SCORE.SNO AND SCORE.CNO='004'); 例3-39:(返回多列的子查询) 求与 李丽 同系且同龄的学生的姓名和系。 SELECT SNAME,SDEPT FROM STUDENTWHERE SDEPT IN(SELECT SDEPT FROM STUDENT WHERE SNAME='李丽')AND SAGE IN(SEL

30、ECT SAGE FROM STUDENT WHERE SNAME='李丽'); 例3-40:(多个子查询) 求与 黎明 同系,且年龄大于 李丽 的学生的信息。 SELECT *FROM STUDENT WHERE SDEPT IN(SELECT SDEPT FROM STUDENT WHERE SNAME='黎明')AND SAGE>(SELECT SAGE FROM STUDENT WHERE SNAME='李丽'); 例3-41:(子查询中使用表连接) 求数学系中年龄相同的学生的姓名和年龄。 SELECT SNAME,SAGE FRO

31、M STUDENTWHERE SAGE IN(SELECT S1.SAGE FROM STUDENT S1,STUDENT S2 WHERE S1.SAGE=S2.SAGE AND S1.SDEPT='MA'); 例3-42:(连接或嵌套查询) 检索至少选修王成刚老师所授课程中一门课程的女学生姓名。 SELECT SNAME FROM STUDENTWHERE EXISTS (SELECT *FROM SCORE WHERE STUDENT.SNO=SCORE.SNOAND SCORE.CNO IN (SELECT CNO FROM TEACH WHERE TNAME='

32、;王成刚')AND STUDENT.SSEX='女'); 例3-43:(嵌套与分组查询) 检索选修某课程的学生人数多于3人的教师姓名。 SELECT TNAME FROM TEACHWHERE EXISTS(SELECT * FROM SCORE WHERE TEACH.CNO=SCORE.CNOGROUP BY TNAMEHAVING COUNT(DISTINCT SNO)>3); 例3-44:(集合查询) 列出所有教师和同学的姓名和性别。SELECT SNAME,SSEX FROM STUDENTUNIONSELECT TNAME,TSEX FROM TEAC

33、H; 例3-45:(相关子查询) 求未选修课程004的学生的姓名。 SELECT SNAME FROM STUDENT WHERE NOT EXISTS(SELECT *FROM SCORE WHERE STUDENT.SNO=SCORE.SNO AND SCORE.CNO='004'); 例3-46:(相关子查询) 求选修了全部课程的学生的姓名。SELECT SNAME FROM STUDENT WHERE NOT EXISTS(SELECT *FROM COURSE WHERE NOT EXISTS(SELECT *FROM SCORE WHERE STUDENT.SNO=

34、SCORE.SNOAND COURSE.CNO=SCORE.CNO); 例3-47:(相关子查询) 求至少选修了学生 96002 所选修的全部课程的学生的学号。 SELECT DISTINCT SNO FROM SCORE SC1 WHERE NOT EXISTS(SELECT *FROM SCORE SC2WHERE SC2.SNO='96002' AND NOT EXISTS(SELECT *FROM SCORE SC3 WHERE SC3.CNO=SC2.CNO AND SC3.SNO=SC1.SNO); 例3-48:(相关子查询) 求成绩比所选修课程平均成绩高的学生的学

35、号、课程号、和成绩。SELECT SNO,CNO,SCORE FROM SCORE SC1WHERE SCORE>(SELECT AVG(SCORE) FROM SCORE SC2 WHERE SC1.CNO=SC2.CNO); 例3-49:(相关子查询) 查询被一个以上的学生选修的课程号。SELECT CNO FROM SCOREGROUP BY CNOHAVING COUNT(CNO)>1;例3-50:(相关子查询) 查询所有未选课程的学生姓名和所在系。 SELECT SNAME,SDEPT FROM STUDENTWHERE NOT EXISTS(SELECT * FROM

36、SCORE WHERE STUDENT.SNO=SCORE.SNO);实验四:视图、授权控制与事务处理 实验目的 通过实验进一步理解视图的建立和更新、数据库的权限管理和事务处理功能。 实验要求 建立视图,视图查询,视图更新; 给某一或全部用户授权和收回授权; 事务回退,事务提交。 实验内容 4 SQL视图的定义与操纵: 例4-1: (建立视图) 建立计算机系的学生的视图STUDENT_CS。CREATE VIEW STUDENT_CSAS SELECT * FROM STUDENT WHERE SDEPT='CS' 例4-2: (建立视图) 建立由学号和平均成绩两个字段的视图S

37、TUDENT_GR。CREATE VIEW STUDENT_GR(SNO,SAVG)ASSELECT SNO,AVG(SCORE) FROM SCOREGROUP BY SNO; 例4-3: (视图查询) 利用视图STUDENT_CS,求年龄大于19岁的学生的全部信息。SELECT * FROM STUDENT_CS WHERE SAGE>19; 例4-4: (视图查询) 利用视图STUDENT_GR,求平均成绩为88分以上的学生的学号和平均成绩。SELECT SNO,SAVG FROM STUDENT_GR WHERE SAVG>88; 例4-5: (视图更新) 利用视图STUD

38、ENT_CS,增加学生( 96006,张然,CS,02,男,19 )。INSERT INTO STUDENT_CS VALUES('96006','张然','CS','02',19,'男'); 例4-6: (视图更新) 利用视图STUDENT_CS,将学生年龄增加1岁。观察其运行结果并分析原因。 UPDATE STUDENT_CS SET SAGE=SAGE+1; 例4-7: (视图更新) 利用视图STUDENT_GR,将平均成绩增加2分。观察其运行结果并分析原因。因为此视图的列SAVG是表达式,所以不允许更新。

39、例4-8: (视图更新) 删除视图STUDENT_CS中学号为 96006 的学生的全部数据。DELETE FROM STUDENT_CS WHERE SNO='96006' 例4-9: (视图更新) 删除视图STUDENT_GR的全部数据。DELETE FROM STUDENT_GR;因为视图STUDENT_GR的列(平均成绩)由集函数组成,不允许被更新。 例4-10:(删除视图) 删除视图STUDENT_CS和STUDENT_GR。DROP VIEW STUDENT_CS;DROP VIEW STUDENT_GR;5 SQL数据控制语句: 例5-1: (授权) 给左右邻近同

40、学(用户)授予在表Student上的SELECT权限,并使这两个用户具有给其他用户授予相同权限的权限。GRANT SELECT ON STUDENT TO U109074070WITH GRANT OPTION; 例5-2: (授权) 给邻近同学(用户)授予Teach表上的所有权限。GRANT ALL ON TEACH TO U109074070; 例5-3: (授权) 给所有用户授予Score表上的SELECT权限。GRANT SELECT ON SCORE TO PUBLIC; 例5-4: (授权验证) 观察左右邻近同学查询你所授权的表中的内容。 例5-5: (收回授权) 收回上面例子中的

41、所有授予的权限。6 SQL事务处理: 例6-1: (事务回退) 将课程名称表中的 程序设计 课程学时数修改为80、 微机原理 课程学时数修改为70学时,查询全部课程的总学时数后,取消所有修改(ROLLBACK)。再次查询全部课程的总学时数。注意比较分析两次查询的结果。UPDATE COURSE SET CTIME=80 WHERE CNAME='程序设计'UPDATE COURSE SET CTIME=70 WHERE CNAME='微机原理'SELECT SUM(CTIME) FROM COURSE;ROLLBACK;SELECT SUM(CTIME) FRO

42、M COURSE; 例6-2: (事务提交) 将课程名称表中的 程序设计 课程学时数修改为80、 微机原理 课程学时数修改为70学时,查询全部课程的总学时数后,确认所有修改(COMMIT)。再次查询全部课程的总学时数。注意比较分析两次查询的结果。UPDATE COURSE SET CTIME=80 WHERE CNAME='程序设计'UPDATE COURSE SET CTIME=70 WHERE CNAME='微机原理'SELECT SUM(CTIME) FROM COURSE;COMMIT;SELECT SUM(CTIME) FROM COURSE;实验五:

43、Oracle存储过程与触发器 实验目的 通过实验进一步理解和掌握Oracle数据库的存储过程和触发器。 实验要求 创建、调试和修改、调用和执行Oracle存储过程; 创建、调试和修改、测试Oracle触发器。 实验内容 7 存储过程与触发器:例7-1: (存储过程) 创建一个显示学生总人数的存储过程。SET SERVEROUTPUT ONCREATE OR REPLACE PROCEDURE STU_COUNT ASTOTAL NUMBER;BEGIN SELECT COUNT(SNO) INTO TOTAL FROM STUDENT; DBMS_OUTPUT.PUT_LINE('总数

44、:'|TOTAL);END;例7-2: (存储过程) 创建显示学生信息的存储过程STUDENT_LIST,并引用STU_COUNT存储过程。CREATE OR REPLACE PROCEDURE STUDENT_LISTASCURSOR SX IS SELECT *FROM STUDENT; BEGIN -STU_COUNT; FOR K IN SX LOOP DBMS_OUTPUT.PUT_LINE(' '|K.SNO|''|K.SNAME|' '|K.SDEPT|' '|K.SSEX|' '|K.SDE

45、PT); END LOOP;END;/例7-3: (存储过程) 创建一个显示学生平均成绩的存储过程。CREATE OR REPLACE PROCEDURE SAVG ASAVE NUMBER(4,2);CURSOR SY IS SELECT SNO, AVG(SCORE) AS AVE FROM SCORE GROUP BY SNO; BEGIN FOR K IN SY LOOP DBMS_OUTPUT.PUT_LINE(' '|K.SNO|' '|K.AVE); END LOOP;END;/例7-4: (存储过程) 创建显示所有学生平均成绩的存储过程。CREA

46、TE OR REPLACE PROCEDURE STUDENT_AVGAS AVE NUMBER(4,2); BEGIN SELECT AVG(SCORE) INTO AVE FROM SCORE; DBMS_OUTPUT.PUT_LINE(' '|AVE);END;/例7-5: (修改数据库表) 在Student表中增加SAVG(N,6,2) 字段。ALTER TABLE STUDENT ADD SAVG NUMBER(6,2);例7-6: (存储过程) 创建存储过程,计算每个学生的平均成绩保存到学生表SAVG字段中。 CREATE OR REPLACE PROCEDURE

47、STUDENT_SAVG AS TYPE SC IS RECORD( SC_SNO STUDENT.SNO%TYPE, SC_AVG STUDENT.SAVG%TYPE); RE_SC SC; CURSOR LIST_CUSOR IS SELECT SNO,AVG(SCORE) FROM SCORE GROUP BY SNO; BEGIN OPEN LIST_CUSOR; LOOP FETCH LIST_CUSOR INTO RE_SC; EXIT WHEN LIST_CUSOR %NOTFOUND; UPDATE STUDENT SET SAVG=RE_SC.SC_AVG WHERE SNO=RE_SC.SC_SNO; END LOOP; CLOSE LIST_CUSOR; END;/例7-7: (触发器) 当更新学生成绩表SCORE中的学生成绩时,自动计算该学生的平均成绩保存到学生表SAVG字段中。 CREATE OR REPLACE TRIGGER SCORE_SCORE AFTER INS

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论