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

/**
  通过存储过程
  自动计算出 :每位学生的总成绩和平均成绩 
  同时,如果学生在课外课程中获得的评价为 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;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值