编写一个匿名块,实现输入一个学生的学号,输出该学生的姓名,性别和专业。如果出现异常,则输出”程序出现错误,请与管理员联系”。(20分)
(2)编写一个匿名块,统计某系学生人数,如果没有学生,则显示“**系还没有学生”。执行程序,体会IF…ELSE的用法。(20分)
(3)编写一个匿名块,对SC表中的某学生的某一门成绩进行等级评定。评定规则为:成绩大于等于90,为优秀;成绩小于90而大于等于80,为良好;成绩小于80而大于等于70,为中等;成绩小于70而大于等于60,为及格;成绩小于60,为不及格。其它情况,为待定。执行程序,体会CASE的用法。(30分)
(4)编写一个匿名块,计算从m-n的数据之和。(30分)
解答:
(1)编写一个匿名块,实现输入一个学生的学号,输出该学生的姓名,性别和专业。如果出现异常,则输出”程序出现错误,请与管理员联系”。(20分)
-- 声明一个变量,用于存储输入的学号
DECLARE
v_sno VARCHAR2(10);
-- 声明一个游标,用于查询学生信息
CURSOR c_student IS
SELECT sname, sex, major FROM student WHERE sno = v_sno;
-- 声明一个记录类型,用于存储游标返回的结果
c_student_rec c_student%ROWTYPE;
BEGIN
-- 输入学号
v_sno := &sno;
-- 打开游标
OPEN c_student;
-- 获取游标返回的第一行数据
FETCH c_student INTO c_student_rec;
-- 如果游标有数据,则输出学生信息
IF c_student%FOUND THEN
DBMS_OUTPUT.PUT_LINE('姓名:' || c_student_rec.sname);
DBMS_OUTPUT.PUT_LINE('性别:' || c_student_rec.sex);
DBMS_OUTPUT.PUT_LINE('专业:' || c_student_rec.major);
ELSE
-- 如果游标没有数据,则输出提示信息
DBMS_OUTPUT.PUT_LINE('没有找到该学号对应的学生');
END IF;
-- 关闭游标
CLOSE c_student;
EXCEPTION
-- 如果出现异常,则输出错误信息
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('程序出现错误,请与管理员联系');
END;
```
(2)编写一个匿名块,统计某系学生人数,如果没有学生,则显示“**系还没有学生”。执行程序,体会IF…ELSE的用法。(20分)
```sql
-- 声明一个变量,用于存储输入的系名
DECLARE
v_dname VARCHAR2(20);
-- 声明一个变量,用于存储统计结果
v_count NUMBER;
BEGIN
-- 输入系名
v_dname := &dname;
-- 查询某系学生人数,并赋值给变量v_count
SELECT COUNT(*) INTO v_count FROM student WHERE dname = v_dname;
-- 如果v_count大于0,则输出统计结果
IF v_count > 0 THEN
DBMS_OUTPUT.PUT_LINE(v_dname || '系共有' || v_count || '名学生');
ELSE
-- 如果v_count等于0,则输出提示信息
DBMS_OUTPUT.PUT_LINE(v_dname || '系还没有学生');
END IF;
END;
```
(3)编写一个匿名块,对SC表中的某学生的某一门成绩进行等级评定。评定规则为:成绩大于等于90,为优秀;成绩小于90而大于等于80,为良好;成绩小于80而大于等于70,为中等;成绩小于70而大于等于60,为及格;成绩小于60,为不及格。其它情况,为待定。执行程序,体会CASE的用法。(30分)
```sql
-- 声明两个变量,用于存储输入的学号和课程号
DECLARE
v_sno VARCHAR2(10);
v_cno VARCHAR2(10);
-- 声明一个变量,用于存储查询结果
v_grade NUMBER;
BEGIN
-- 输入学号和课程号
v_sno := &sno;
v_cno := &cno;
-- 查询某学生某课程的成绩,并赋值给变量v_grade
SELECT grade INTO v_grade FROM sc WHERE sno = v_sno AND cno = v_cno;
-- 根据成绩进行等级评定,并输出结果
DBMS_OUTPUT.PUT_LINE('该学生该课程的成绩等级为:' ||
CASE
WHEN v_grade >= 90 THEN
'优秀'
WHEN v_grade < 90 AND v_grade >= 80 THEN
'良好'
WHEN v_grade < 80 AND v_grade >= 70 THEN
'中等'
WHEN v_grade < 70 AND v_grade >= 60 THEN
'及格'
WHEN v_grade < 60 THEN
'不及格'
ELSE
'待定'
END);
END;
```
(4)编写一个匿名块,计算从m-n的数据之和。(30分)给代码添加注释
```sql
-- 声明两个变量,用于存储输入的m和n
DECLARE
v_m NUMBER;
v_n NUMBER;
-- 声明一个变量,用于存储计算结果
v_sum NUMBER := 0;
BEGIN
-- 输入m和n
v_m := &m;
v_n := &n;
-- 使用循环语句,从m到n累加,并赋值给变量v_sum
FOR i IN v_m .. v_n LOOP
v_sum := v_sum + i;
END LOOP;
-- 输出计算结果
DBMS_OUTPUT.PUT_LINE('从' || v_m || '到' || v_n || '的数据之和为:' || v_sum);
END;