当游标的值为空的时候,处理无效员工的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;

游标v_cur的%notfound相关推荐

  1. oracle游标语法举例,PL/SQL语句块基本语法(ORACLE存储过程,函数,包,游标)

    1.PL/SQL语句块 PL/SQL语句块只适用于Oracle数据库,使用时临时保存在客户端,而不是保存在数据库. 基本语法: declare 变量声明.初始化 begin 业务处理.逻辑代码 exc ...

  2. oracle有集合为什么要用游标,oracle 游标使用

    游标: 用来查询数据库,获取记录集合(结果集)的指针,我们所说的游标通常是指显式游标,因此从现在起没有特别指明的情况,我们所说的游标都是指显式游标. 要在程序中使用游标,必须首先声明游标分类: 1.静 ...

  3. Oracle游标学习笔记

    游标按以下操作进行 parse 解析 bind 绑定 open 打开 execute 执行 fetch 回取 close 关闭 1.写自己第一个游标PL/SQL declare  cursor c_s ...

  4. oracle ora-01001,ORA-01001 and ORACLE游标

    为了处理sql语句,Oracle必须分配一片内存区域--上下文区域(context area),它包含了完成该处理所必需的信息, 其中包括语句要处理行的数目. 一个指向语句被分析以后产生的表示形式的指 ...

  5. oracle数据库中游标的使用,oracle数据库游标的使用方法

    游标分为隐式游标和显示游标. 一.隐式游标 对于select * into和DML操作(update.delete.insert)都附带有一个隐式游标. 隐式游标的属性 SQL%ROWCOUNT   ...

  6. oracle pl sql注意问题,Oracle PL/SQL编写PL/SQL代码的注意事项

    (1)几个值得注意的关键字(2)变量常量赋值注意: ---------------------------------------------------------------------[@mor ...

  7. [转]SQLServer和Oracle,存储过程区别,常用函数对比

    本文转自:http://www.cnblogs.com/neru/archive/2011/08/18/2144049.html 以前一直用sqlserver,只有很少的一点oracle的经验,现在要 ...

  8. Oracle存在修改,不存在插入记录

    接触编程以来,在数据存储方面一直用的MS SQL.Oracle这名字对我来说是如此的熟悉,但是对其内容却很陌生,最近公司的一个项目用起了Oracle,所以也开始高调的用起了Oracle.在没有接触Or ...

  9. DBMS_SQL的使用

    DBMS_SQL包提供的函数 DBMS_SQL包提供的过程 示例 CREATE OR REPLACE PROCEDURE DBMS_SQL_TEST (TABLE_NAME IN VARCHAR2 ) ...

最新文章

  1. 如何选择合适的损失函数,请看......
  2. 全球最大“同性”交友网站GitHub或被微软收购,收购价可能高达 50 亿美元
  3. 生成下拉框的几种方法总结——数据来源:数据库
  4. 设计模式:备忘录模式(Memento)
  5. python3字典平均值_python3基础之字典
  6. 获取iOS任意线程调用堆栈(一)获取任意线程的调用栈地址列表
  7. javax.comm的API
  8. nginx 新上线、机房白名单
  9. 2019年春PAT甲级考试
  10. windows串口控制linux,是这个linux的串口配置与windows相同
  11. 从《Java核心技术卷Ⅱ》看Java操作pdf的工具类itext
  12. python+java家庭理财个人理财管理系统记账系统
  13. linux ctex缺少字体,Linux下xetex找不到字体
  14. png转ico 或如何制作ico文件
  15. 五步移相法matlab程序_用MATLAB软件对逆变电路移相调压进行仿真,30°,60°,90°的波形,并用分段分析法分析其原理_学小易找答案...
  16. java实现ip首部校验和算法,理解传输层中UDP协议首部校验和以及校验和计算方法的Java实现...
  17. 现在有什么地推项目_目前互联网都有哪些红利地推项目
  18. Matlab S函数求解PD控制的二阶微分或者二阶状态方程
  19. jasper生成动态报表
  20. 用CSS写扫描二维码图标

热门文章

  1. php 没有libmysql.dll,php_mysql_libmysql.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家...
  2. nb移动udp_NB-IOT联网及模块UDP数据传输过程
  3. “云时代”大势当前,专有云成企业上云首选
  4. Linux课程设计石头剪刀布,课程设计-石头剪刀布程序.doc
  5. 支持向量机(SVM)学习小记
  6. pandas查看属性和数据
  7. 机器学习入门(七):多项式回归, PolynomialFeatures详解
  8. c语言编程一张纸对折,关于一张纸的对折问题
  9. 在64位Ubuntu 16.04系统里安装Qt 5.9.1
  10. Jeesite Login 登录 分析