您的位置:首页 > 数据库 > Oracle

Oracle 创建存储过程包实现功能

2013-10-30 13:57 302 查看
/**

通过存储过程

自动计算出 :每位学生的总成绩和平均成绩

同时,如果学生在课外课程中获得的评价为 A ,就在总成绩上加 20 分。

最终将算出的总成绩和平均成绩更新到学生成绩表中

作业要求:作业连10.216.60.47,train实例下的apps用户,

表名,包,存储过程都已自己名字开头

1 必须使用包,存储过程,函数

2 要使用自定义类型,自定义数组

3 使用游标,异常处理

4 添加详细注释

提示:可将学生课外成绩作为自定义类型

**/

--自定义的数组类型 ( 自定义数据类型时 , 建议通过创建 Package 的方式实现 ,以便于管理 )

CREATE OR REPLACE PACKAGE TEST_I_MYPACKAGE IS

----统计学生的总成绩

PROCEDURE CHENS_STUDENTSCORE_CALCULATE;

----计算学生的平均分数

FUNCTION CHENS_GETSCOREBY_A(i_total in number,

i_stdid in varchar2)RETURN number;

end TEST_I_MYPACKAGE;

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

***********************************************************************************************************************************************************************************

----实现

create or replace package body TEST_I_MYPACKAGE is

PROCEDURE CHENS_STUDENTSCORE_CALCULATE is

v_update_exp exception; --更新异常

--定义数组(存储student信息)

vt_student dbms_sql.Varchar2_Table;

cursor c_student is --定义游标记录当前行数据

select t.stdid,

(t.math + t.sprache + t.music + t.sport) as tatol,

(t.math + t.sprache + t.music + t.sport) / 4 as avage

from CHENSHUAI_STUDENT t;

BEGIN

begin

for v_student in c_student loop

vt_student(1) := v_student.stdid;

vt_student(2) := v_student.tatol;

vt_student(3) := round(v_student.avage, 1);

update CHENSHUAI_STUDENT tt--如果学生在课外课程中获得的评价为 A ,就在总成绩上加 20 分

set tt.total = CHENS_GETSCOREBY_A(vt_student(2), vt_student(1)),

tt.average = vt_student(3)

where tt.stdid = vt_student(1);

end loop;

commit;

exception

when others then

raise v_update_exp;

end;

Exception

when v_update_exp then

dbms_output.put_line('更新数据失败');

rollback;

END CHENS_STUDENTSCORE_CALCULATE;----过程end

--根据评价判断是否加分

FUNCTION CHENS_GETSCOREBY_A(i_total in number, i_stdid in varchar2) return number is

Result number;

--课外成绩自定义类型

TYPE OUT_SCHOOL_REC is RECORD(

s_id CHENSHUAI_OUT_SCHOOL.STDID%TYPE,

s_eva CHENSHUAI_OUT_SCHOOL.EVALUATE%TYPE);

OUT_SCHOOL_TAB OUT_SCHOOL_REC;

begin

select t.evaluate

into OUT_SCHOOL_TAB.s_eva

from CHENSHUAI_OUT_SCHOOL t

where t.stdid = i_stdid;

--当评价为A时,加20分

if OUT_SCHOOL_TAB.s_eva = 'A' then

Result := i_total + 20;

else

Result := i_total;

end if;

return(Result);

end CHENS_GETSCOREBY_A;

end TEST_I_MYPACKAGE;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐