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;
通过存储过程
自动计算出 :每位学生的总成绩和平均成绩
同时,如果学生在课外课程中获得的评价为 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;
相关文章推荐
- 创建序列和触发器实现Oracle字段自增功能
- Oracle SQL中实现indexOf和lastIndexOf功能,substr和instr用法
- 创建一个函数,实现库函数strstr的功能
- 在oracle中实现DateDiff函数的功能
- MYSQL-实现分组排序 对比 ORACLE 和SQLserver用 row_number() over(partition by ) 分组排序功能
- SQLServer 实现oracle中rownum 的功能
- Oracle 10g数据库中,当在数据库中创建用户时,基于应用性能和管理方面的考虑,最好为不同的用户创建独立的表空间。 那么创建表空间的步骤是怎样实现的呢?本文我们主要就介绍了这一部分内容,接下来就让
- 使用MVC5+Entity Framework6的Code First模式创建数据库并实现增删改查功能
- 创建Opener对象以实现Cookie与其它HTTP功能
- ORACLE实现自动备份功能(操作系统:计划任务)
- Oracle 9 中PL/SQL实现FTP功能的文件传输
- oracle中if/else功能的实现的3种写法
- Oracle实现POSTGRESQL的generate_series功能
- MYSQL-实现ORACLE- row_number() over(partition by ) 分组排序功能优化
- 自己创建一个新的Vec类用来实现vector的功能
- sqlserver 中如何实现ORACLE中的ROWNUM功能
- Android中实现Launcher功能之二 ----- 添加窗口小部件以及AppWidget的创建详解
- Oracle创建视图实现获取当前数据所在的页数,这里以每页2条数据分页
- java实现单链表的初始化,创建,删除,插入,查找,排序,同项删除,退出等功能
- Oracle Form开发手电筒查找功能实现