游标v_cur的%notfound

当游标的值为空的时候,处理无效员工的id时就会出现错误.

比如:

创建一个程序检索某个员工的工龄

   a.创建一个函数GET_SERVICE_YRS,检索某个员工总的工龄;

    此函数应该接受员工ID作为输入参数,返回工龄。增加例外处理无效的员工id输入;

   b.调用函数,你能使用下面的数据

EXECUTE DBMS_OUTPUT.PUT_LINE(get_service_yrs(999))

表job_history为


create or replace function get_service_yrs(

  p_employee_id in NUMBER)

  return  NUMBER

  IS

  service_year NUMBER(7,2) := 0;

  sum_month NUMBER(7,2) := 0;

  CURSOR cur_jobIS

    SELECT start_date,end_date

    FROM job_history

    WHERE job_history.employee_id = p_employee_id;

  e_invaild_1 EXCEPTION;

BEGIN

  FOR job_his_recordIN cur_jobLOOP

  sum_month := months_between(job_his_record.end_date,job_his_record.start_date);  

  sum_month := sum_month + sum_month;

  IF SQL%NOTFOUND THEN

    RAISE e_invaild_1;

  END IF;

  END LOOP;

  service_year := (sum_month)/12;

  return(service_year);

EXCEPTION 

  WHEN e_invaild_1THEN

    dbms_output.put_line('无效的员工id');

    RETURN NULL;

  WHEN OTHERS THEN

    dbms_output.put_line('............');

    RETURN NULL;

end get_service_yrs;


---测试

DECLARE 

BEGIN

  dbms_output.put_line(get_service_yrs(999));

END;


 当不存在该员工的ID时,就会出现意想不到的结果,比如下面,因为该游标为空,for循环根本进不去,在想想我们可以 不用游标,但游标有一个很大的功能就是取多值,而这个例子中就要多值,员工的总工龄,这时我们想到用loop,先进入循环在判断。

但要注意只用cur_job%notfound,就会出现游标不空时,也要调用异常,在加一个cur_job%count=0就解决问题了。

所以,

open cursor_name;

loop

   fetch cursor_name into ....;

  (加条件);

  exit when ...;

end loop;

如下代码:

CREATE OR REPLACE FUNCTION GET_SERVICE_YRS(P_EMPLOYEE_ID IN NUMBER)

  RETURN NUMBER IS

  SERVICE_YEAR NUMBER(7, 2) := 0;

  SUM_MONTH    NUMBER(7, 2) := 0;

  CURSOR CUR_JOB IS

    SELECT START_DATE, END_DATE

      FROM JOB_HISTORY

     WHERE JOB_HISTORY.EMPLOYEE_ID = P_EMPLOYEE_ID;

  E_INVAILD_1 EXCEPTION;

  V_END_DATE   JOB_HISTORY.END_DATE%TYPE;

  V_START_DATE JOB_HISTORY.START_DATE%TYPE;

BEGIN

  OPEN CUR_JOB;

  LOOP

    FETCH CUR_JOB

      INTO V_START_DATE, V_END_DATE;

    IF CUR_JOB%NOTFOUND AND cur_job%ROWCOUNT=0 THEN

      RAISE E_INVAILD_1;

    END IF;

    EXIT WHEN CUR_JOB%NOTFOUND;

    SUM_MONTH := SUM_MONTH + MONTHS_BETWEEN(V_END_DATE, V_START_DATE);

  END LOOP;

  CLOSE CUR_JOB;

  SERVICE_YEAR := (SUM_MONTH) / 12;

  RETURN(SERVICE_YEAR);

EXCEPTION

  WHEN E_INVAILD_1 THEN

    DBMS_OUTPUT.PUT_LINE('无效的员工id');

    RETURN NULL;

  WHEN OTHERS THEN

    DBMS_OUTPUT.PUT_LINE(SQLERRM);

    RETURN NULL;

END GET_SERVICE_YRS;



 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值