实验三--PLSQL程序设计

1.实验目的
熟悉PL/SQL子程序设计。
2. 实验内容
创建存储过程pro_StudentsNotUpToStandar返回指定系部未修够指定学分的学生 信息,包括学生的基本信息,以及学生所有选课的课程信息和成绩。
3.(1)存储过程pro_StudentsNotUpToStandar调用后的输出显示效果如下图:
在这里插入图片描述
在这里插入图片描述
(2)存储过程pro_StudentsNotUpToStandar的程序流程框架如下:
create or replace procedure pro_StudentsNotUpToStandar
(p_deptID varchar2,p_standerCredit number)
as
–定义形参为null时抛出的用户自定义异常变量
–定义根据形参部门代码查询指定系部所有学生信息的游标1;
–定义保存学生所有学分的变量
–定义保存当前学生编号变量
–定义根据当前学生编号查询学生所有选修课程信息及学生成绩的游标2;

begin
–如果形参有为null的情况,抛出用户自定义异常
–循环遍历游标1,完成以下任务:
–查询当前学生获得的所有学分;
–如果学生的总学分小于形参给出的达标学分,就完成以下任务:
–首先输出学生的信息;
–然后遍历游标2,输出学生选修的所有课程信息
EXCEPTION
–处理用户自定义异常
end;
(3)代码:

--创建存储过程pro_StudentsNotUpToStandar返回指定系部未修够指定学分的学生信息,包括学生的基本信息,以及学生所有选课的课程信息和成绩
CREATE OR REPLACE PROCEDURE PRO_STUDENTSNOTUPTOSTANDAR(P_DEPTID IN VARCHAR2,P_STANDERCREDIT IN NUMBER)
IS 
  NULL_EX EXCEPTION;
  CURSOR STUS_CUR IS
  SELECT * FROM STUDENTS S WHERE S.DEPT_ID=P_DEPTID;
  V_CREDITS NUMBER:=0;
  V_STUID VARCHAR2(11);
  CURSOR COUINFOS_CUR IS SELECT A.*,B.GRADE FROM COURSES A,SC B WHERE B.STUDENT_ID=V_STUID AND A.COURSE_ID=B.COURSE_ID;
BEGIN
 IF P_DEPTID IS NULL OR P_STANDERCREDIT IS NULL THEN
  RAISE NULL_EX;
 END IF;
  FOR STU IN STUS_CUR LOOP
   V_STUID:=STU.STUDENT_ID;
   SELECT SUM(C.CREDITS) INTO V_CREDITS FROM SC,COURSES C WHERE C.COURSE_ID=SC.COURSE_ID AND SC.STUDENT_ID=V_STUID  AND SC.GRADE>=60;
   IF V_CREDITS < P_STANDERCREDIT THEN
    DBMS_OUTPUT.PUT_LINE(STU.STUDENT_ID||' '||STU.SNAME||' '||STU.SSEX||' '||STU.SBIRTH||''||STU.NATIONALITY||' '||STU.DEPT_ID||' '||STU.CLASS_ID);
    FOR INFO IN COUINFOS_CUR LOOP
     DBMS_OUTPUT.PUT_LINE(INFO.COURSE_ID||' '||INFO.CNAME||' '||INFO.CREDITS||' '||INFO.GRADE);
    END LOOP;
   END IF;
   END LOOP;
   EXCEPTION
      WHEN NULL_EX THEN DBMS_OUTPUT.PUT_LINE('形参不能为空!');
END;

版权声明:本文为qq_41007733原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。