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;