Loading... # Ch.8 数据库编程 ## 8.1 使用嵌入式SQL对学生-课程数据库中的表完成下述功能 ### 8.1.1 查询一门课程的信息,要查询的课程由用户在程序运行过程中指定,放在主变量中 ```sql -- 定义主变量 :HCno, :HCname, :HCpno, :HCredit -- 读入用户输入变成号,放入变量: givencno EXEC SQL SELECT Cno, Cname, Cpno, Ccredit INTO :HCno, :HCname, :HCpno, :HCredit FROM Course WHERE Cno=:givecno: ``` ### 8.1.2 查询选修某一门的选课信息,要查询的课程号由用户在程序运行过程中指定,放在主变量中,然后根据用户的要求修改其中某些记录的成绩字段 ```sql -- 定义主变量 :HSno, :HCno, :HGrade, :givencno, :NEWGrade -- 在程序中输入要查询的课程号,放入主变量 :givencno -- 定义游标SCX,对应的sql语句 EXEC SQL DECLARE SCX CURSOR FOR SELECT Sno, Cno,Gradet FROM SC WHERE Cno = :givecno:; EXEC SQL OPEN SCX; for(;;){ EXEC SQL FETCH SCX INTO :HSno, :HCno, :HGrade; -- 推进游标,将当前数据放入主变量 -- 显示查询结果,询问用户是否要更新该条记录的选修成绩 -- 如果用户更新操作 -- 用户输入新的成绩到 :NEWgrade 中,然偶多当前游标指向的选修课成绩进行更新 EXEC SQL UPDATE SC SET grade=:NEWgrade WHERE CURRENT OF SCX; } EXEC SQL CLOSE SCX; -- 提交更新 ``` ## 8.2 对学生-课程数据库,编写存储过程,完成下列功能 ### 8.2.1 统计离散数学的成绩分布状况,即按照各分数段统计人数 ```sql CREATE PROCEDURE discreate_math_grade() AS DECLARE CURSOR dist FOR SELECT grade FROM SC WHERE cno-( SELECT cno FROM Course WHERE Cname='离散数学' ); p_100 NUMBER := 0; p_90 NUMBER := 0; p_80 NUMBER := 0; p_70 NUMBER := 0; p_60 NUMBER := 0; p_other NUMBER := 0; p_grade NUMBER; BEGIN -- 打开游标 OPEN dist; LOOP FETCH dist INTO p_grade; EXIT WHEN(dist%NOTFOUND); IF(p_grade==100) THEN p_100 := p_100 + 1; ELSE IF(p_grade >= 90) THEN p_90 := p_90 + 1; ELSE IF(p_grade >= 80) THEN p_80 := p_80 + 1; ELSE IF(p_grade >= 70) THEN p_70 := p_70 + 1; ELSE IF(p_grade >= 60) THEN p_60 := p_60 + 1; ELSE p_other := p_other + 1; END LOOP; CLOSE dist; END; ``` ### 8.2.2 输入任意一门课的课程名,计算选修课程学生的平均成绩 ```sql CREATE PROCEDURE avegrade(incname CHAR(40)) AS BEGIN SECLECT AVG(Grade) FROM SC WHERE Cno=( SELECT Cno FROM Course WHERE Cname=incname ); END; ``` ### 8.2.3 扫描SC表,把学生选课成绩grade的值由百分制更新为等级制 ```sql CREATE PROCEDURE gradetype() AS DECLARE CURSOR gradecursor FOR SELECT grade FROM SC; scgrade NUMBER; score CHAR(1); BEGIN OPEN gradecursor; LOOP FETCH gradecursor INRO scgrade; EXIT WHEN(gradecursor %NOTFOUND); IF(scgrade >= 90 AND scgrade <=100) THEN score := 'A'; ELSE IF(scgrade >= 80) THEN score := 'B'; ELSE IF(scgrade >= 70) THEN score := 'C'; ELSE IF(scgrade >= 60) THEN score := 'D'; ELSE score := 'E'; END IF; END LOOP; END; ``` 最后修改:2020 年 11 月 01 日 © 允许规范转载 赞 0 如果觉得我的文章对你有用,请随意赞赏