游标v_cur的%notfound

2023-05-16

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



 


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

游标v_cur的%notfound 的相关文章

  • 套接字(描述符)读取指定的字节数

    检测fd句柄是否可读 xff0c ms毫秒超时 参数 xff1a df in 检测的句柄 ms in 超时 xff0c 毫秒 返回 xff1a 1 可读 xff0c 或者已经断开 0 超时 xff0c 仍然不可读 1 错误 int IsRe
  • 4.4线索二叉树遍历

    1 中序线索二叉树遍历 找到第一个中序遍历的结点 ThreadNode span class token operator span span class token function Firstnode span span class t
  • 自动根据本机字节序 将小端字节序的报文(字符数组)转为整数

    1 xff0c 判断本机的字节序 xff08 大端优先 小端优先 xff09 判断当前PC为大端还是小端字节序 64 返回值 xff1a 1 大端 xff1b 0 小端 int JudgeEndianOfPC int num 61 1 if
  • 智能指针的使用

    智能指针在C 43 43 11版本之后提供 xff0c 包含在头文件 lt memory gt 中 xff0c shared ptr unique ptr weak ptr 1 xff0c shared ptr的使用 shared ptr使
  • 图像检索系列——利用深度学习实现以图搜图

    转载自 xff1a 图像检索系列 利用深度学习实现以图搜图 知乎 前言 在上一篇文章 图像检索系列 利用 Python 检测图像相似度 中 xff0c 我们介绍了一个在图像检索领域非常常用的算法 感知哈希算法 这是一个很简单且快速的算法 x
  • Windows下select模型(以及EAGAIN、EWOULDBLOCK、EINTR)

    在这里记录一下 xff0c 以前都是新项目用到了就从旧项目中拷贝 自从将博客当作记事本 xff0c 发现自己多了一个好习惯 Windows下select模型 程序员攻略 CSDN博客 套接字IO超时设置和使用select实现超时管理 wj
  • RANSAC算法理解

    RANSAC是 RANdom SAmple Consensus xff08 随机抽样一致 xff09 的缩写 它可以从一组包含 局外点 的观测数据集中 xff0c 通过迭代方式估计数学模型的参数 它是一种不确定的算法 它有一定的概率得出一个
  • C++ 环形缓冲区(队列)简单实现

    1 说明 在实际工作中 xff0c 如果数据流量过大 xff0c 可以先把数据接收到数据缓冲区中 xff0c 处理之后再取出 我们定义的包协议可以采用定长包 xff0c 可以采用不定长度的包 xff0c 环形缓冲区都能处理 2 使用场景 2
  • Visual Studio Code (vscode) 配置 C / C++ 环境

    Visual Studio Code vscode 配置 C C 43 43 环境 步平凡 博客园 在电脑安装软件管控严格的情况下 xff0c 想装VS装不了 xff0c 就装轻量版的VSCode了 以上写得很好 xff0c 照做即可 本人
  • c++实现basename

    window API居然不包含Linux中很好用的basename函数 xff0c 实现了一下 xff0c 留个记录 xff0c 省得日后重复写 std string m basename std string fullPath size
  • tortoiseGit教程

    0 前言 TortoiseGit其实是一款开源的git的版本控制系统 xff0c 也叫海龟git TortoiseGit提供了人性化的图形化界面 xff0c 不用像Git一样输入许多语句 xff0c 像git init git add gi
  • 用STL库创建线程

    测试了3种方式 xff1a 1 xff1a 子线程不带返回值 2 xff1a 子线程带返回值 3 xff1a 子线程带引用类型参数 使用join方式 xff0c 让父线程等待子线程运行结束 TestTemp cpp 定义控制台应用程序的入口
  • 4.5树的存储

    双亲表示法 xff0c 孩子表示法 xff0c 孩子兄弟表示法 1 双亲表示法 查找双亲简单 空数据导致遍历更慢 xff0c 查指定节点的孩子只能遍历 span class token keyword typedef span ElemTy
  • Windows下MySQL数据库的安装、配置及C++使用案例

    1 安装及配置 Windows判断本地是否安装mysql以及mysql安装过程 企鹅要去银河思考人生 xff01 xff01 xff01 的博客 CSDN博客 windows查看是否安装mysql 注意按照文中提示 xff0c 配置好环境变
  • C++获取系统毫秒级时间(自1970年1月1日至今的毫秒数)

    跟系统时间相关的 ifdef WIN32 include lt time h gt include lt windows h gt else include lt sys time h gt endif unsigned long long
  • Window 10下SQL Server的安装配置以及C++使用案例

    1 SQL Server2008的安装与配置 参照下面这篇博客实现即可 里面提供了安装包下载方式 xff08 百度网盘有点慢 xff09 安装及配置步骤 SQLServer安装教程 xff08 史上最详细版本 xff09 杨林伟的博客 CS

随机推荐