当前位置: 代码迷 >> Oracle开发 >> oracle包,函数,进程,游标的使用
  详细解决方案

oracle包,函数,进程,游标的使用

热度:28   发布时间:2016-04-24 06:47:29.0
oracle包,函数,过程,游标的使用
1
VIEW(V_COU_TEA_STU):
显示课程名,授课老师,课程所选学生数,课程是否可选。
2
PROCEDURE(P_TEA_SAL_BOUNS):
输入课程号,若该课程学生平均成绩达标并且不合格人数 <3 时,该任课老师加薪10%。若超过1/3学生不合格,显示任课老师信息以及不合格学生ID,且该课程任课老师的奖金取消。
3
PACKAGE(PKG_F001),包括下面功能:
3.1
创建FNCTION(PKG_F001_FNCTION)、根据输入学生学号,判断学生各课程成绩等级(A:100-90,B:89-80,C:79-60,D:小于60)并输出各课程成绩等级。
3.2
    创建PROCEDURE(PKG_F001_PROCEDURE_01),当传入学生姓名和课程名以及成绩时,则将传入值插入V_SUD_COU_SCO视图中,若视图不存在则创建视图,若输入学生姓名已经存在,则修改视图中课程名与成绩。
3.3
    创建PROCEDURE(PKG_F001_PROCEDURE_02),当输入学生学号时,则将V_SUD_COU视图中该学生对应的信息全部删除
    若该学号不存在,则给出相关提示。
3.4
    定义一个TRIGGER(PKG_FOO1_TRIGGER),要求建立一个日志表(SCS_LOG)记录有关V_SUD_COU_SCO视图的增删情况。
附:日志表字段(LOG_Category,LOG_Time)
3.5
使用带参数的游标,分别显示同一学生不同课程的分数。

------解决方案--------------------
这个过程写两个小时,终于调好了
/***************************
*Name: cux_xzh_proc_teacher_sal
*Purpose: 输入课程号,
*  若该课程学生平均成绩达标并且不合格人数 <3 时,该任课老师加薪10%。
*  若超过1/3学生不合格,显示任课老师信息以及不合格学生ID,且该课程任课老师的奖金取消。
*Author: XZH
*Create At: 2013-12-11
****************************/
CREATE OR REPLACE PROCEDURE cux_xzh_proc_201312111614(
  --o_retcode OUT NUMBER,
  --o_errmsg OUT VARCHAR2,
  o_cid IN xzh_course.cid%TYPE 
)
AS
  v_avg_grade NUMBER;          /*指定课程学生的平均成绩*/     
  v_rate NUMBER;                               /*及格率*/
  v_fail NUMBER;                               /*不合格人数*/
  /*定义教师游标*/
  CURSOR teacher_info_cur
    IS
     SELECT DISTINCT t.*
       FROM xzh_teacher t, xzh_course c, xzh_grade g
      WHERE t.tid = c.tid
        AND c.cid = g.cid
        AND c.cid = o_cid;
  
  /*学生游标*/
  CURSOR fail_sno_cur
  IS
   SELECT s.sno sno,g.grade grade
     FROM xzh_student s, xzh_course c, xzh_grade g
    WHERE s.sno = g.sno
      AND c.cid = g.cid
      AND c.cid = 1
      AND g.grade < 60;
BEGIN
  /*得到平均成绩v_avg_grade*/
  SELECT AVG(g.grade) INTO v_avg_grade
    FROM xzh_course c, xzh_grade g
   WHERE c.cid = g.cid
     AND g.cid = o_cid;
  DBMS_OUTPUT.PUT_LINE(o_cid
------解决方案--------------------
'课程的平均成绩为:'
------解决方案--------------------
v_avg_grade);  
  /*得到不合格人数*/    
  SELECT COUNT(g.sno) INTO v_fail
    FROM xzh_course c, xzh_grade g
   WHERE c.cid = o_cid
     AND c.cid = g.cid
     AND g.grade <60;
  DBMS_OUTPUT.PUT_LINE(o_cid
------解决方案--------------------
'课程的不及格人数为:'
------解决方案--------------------
v_fail); 
 
  /*得到比率v_rate*/
  SELECT e1.n1 / e2.n2
    INTO v_rate
    FROM (SELECT COUNT(g.sno) n1
            FROM xzh_course c, xzh_grade g
           WHERE c.cid = g.cid
             AND g.cid = o_cid
             AND GRADE < 60) e1,
         
         (SELECT COUNT(g.sno) n2
            FROM xzh_course c, xzh_grade g
           WHERE c.cid = g.cid
             AND g.cid = o_cid) e2;
  DBMS_OUTPUT.PUT_LINE(o_cid
------解决方案--------------------
'课程的不及格率为:'
------解决方案--------------------
v_rate);              
  IF (v_avg_grade > 60) AND (v_fail < 3) 
    THEN         
  相关解决方案