首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

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

2013-12-13 
oracle包,函数,过程,游标的使用1VIEW(V_COU_TEA_STU):显示课程名,授课老师,课程所选学生数,课程是否可选。2

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         
    DBMS_OUTPUT.PUT_LINE('老师加工资了!');  
    UPDATE teacher_sal_v SET sal=sal+sal*0.1;    /*该任课老师加薪10% */
  ELSIF v_rate > 1/3 
    THEN
      DBMS_OUTPUT.PUT_LINE('老师奖金没有了!');
      UPDATE xzh_teacher
         SET xzh_teacher.comm = NULL
       WHERE xzh_teacher.tid IN
             (SELECT c.tid FROM xzh_course c WHERE c.cid = o_cid);
          
      DBMS_OUTPUT.PUT_LINE('教师ID  姓名  工资  奖金');
      FOR teacher_info IN teacher_info_cur LOOP
        DBMS_OUTPUT.PUT_LINE(teacher_info.tid
[解决办法]
' '
[解决办法]
teacher_info.tname
[解决办法]
' '
[解决办法]
teacher_info.sal
[解决办法]
' '
[解决办法]
teacher_info.comm);
      END LOOP;
      DBMS_OUTPUT.PUT_LINE('学号  成绩');
      FOR record_name IN fail_sno_cur LOOP
        DBMS_OUTPUT.PUT_LINE(record_name.sno
[解决办法]
' '
[解决办法]
record_name.grade);
      END LOOP;
  END IF; 
  EXCEPTION    
    WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('出错了!!!');    
END cux_xzh_proc_201312111614;
/
      
CALL cux_xzh_proc_201312111614(1);
SELECT *FROM xzh_teacher;
SELECT *FROM xzh_course;
SELECT *FROM xzh_grade;

热点排行