游标v_cur的%notfound

2024-03-29 13:58
文章标签 游标 notfound cur

本文主要是介绍游标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;



 


这篇关于游标v_cur的%notfound的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/858776

相关文章

mysql中存储过过程和游标的联合使用

1.SQL如下: DELIMITER //DROP PROCEDURE IF EXISTS PrintAllEmployeeNames5;CREATE PROCEDURE PrintAllEmployeeNames5()BEGINDECLARE error_count INT DEFAULT 0;DECLARE num INT ;DECLARE done INT DEFAULT

SqlServer书上:使用游标输出学生姓名、选修课程名称和期末考试成绩

--使用游标输出学生姓名、选修课程名称和期末考试成绩use teachinggodeclare @sname nchar(8),@cname nchar(10),@final numeric(6,2)--定义变量declare sc_cursor cursor --定义游标forselect sname,cname,finalfrom score join student on(sc

【QT教程】使用qcustomplot完成对图像的拖动、框选缩放、自动缩放、游标等操作

目录 1.Qt 配置qcustomplot2.图像拖拽功能3.图像框选放大4.曲线自动缩放5.图像游标6.【完整代码】将曲线抽象成一个类,以便复用 1.Qt 配置qcustomplot 首先下载qcustomplot官网(qcustomplot下载地址)下载最近的源码,我用的是2.1.1版本。下载完成后解压,得到如下文件。 将.h和.cpp文件加入到工程中 如果使用的是Qt

MySql存储过程(事务、游标嵌套)

DROP PROCEDURE IF EXISTS in_inventory_profit;DELIMITER //CREATE PROCEDURE in_inventory_profit() BEGIN/* Part1:定义变量 */DECLARE inTransferId2nd bigint(20);-- in_transfer表DECLARE inTransferId bigint(20

使用ecal后导致cmake项目的RelWithDebInfo编译类型会报依赖库NOTFOUND错误

cmake项目的RelWithDebInfo编译类型会报依赖库NOTFOUND,Release类型却正常,哪怕该依赖库是RelWithDebInfo类型编译的。 原因:eCAL的cmake脚本强行把Debug/Release之外的类型映射为Release了;如果依赖库以Release类型编译安装就能正常找到,但依赖库pdb的调试符号就没法用了 直接的解决办法:把find_package(e

深入探究MySQL游标(Cursor)

前言 MySQL游标(Cursor)是MySQL中用于处理查询结果的一种机制。游标允许我们在查询结果集中逐行处理数据,而不是一次性获取所有数据。这对于处理大量数据非常有用,因为它可以减少内存消耗并提高性能。在MySQL中,游标主要用于存储过程和函数。 一、游标的概念 游标是一个数据库对象,它允许我们在查询结果集中逐行处理数据。游标可以被视为一个指针,指向查询结果集中的当前行。通过

链表翻转,写法和交换类似,但是需要pre cur 还有一个临时变量nxt记录下一个结点

递归反转单链表(头插法反转部分链表 要弄pre cur 还有nxt(临时变量保存下一个结点 P0指到需要修改的链表的前一个结点 class Solution {public ListNode reverseBetween(ListNode head, int left, int right) {ListNode dummy=new ListNode(-1,head);ListNode p0=

《大话数据结构》静态链表(也称之为:模拟链表,游标实现法)

1.定义 用数组描述的链表叫做:静态链表 我们让数组的元素都由两个数据域组成: 数据域data,用来存放数据元素,也就是我们要处理的数据; 游标cur,相当于单链表中next指针,存放该元素的后继在数组中的下标 对数组第一个和最后一个元素作为特殊元素处理,不存数据 模拟链表的存储结构及初始化的数组状态 #define MAXMIZE 10000//链表的最大长度typedef st

mysql 5.6 存储过程+事务+游标+错误异常抛出+日志写入

MySQL的GET DIAGNOSTICS语句在5.6.4以后才有 简单讲GET DIAGNOSTICS作用: 语句信息,例如错误信息号或者语句影响的行数。 错误信息,例如错误号和错误消息。 使用GET DIAGNOSTICS需要注意的是,它或者包含语句信息,或者包含错误信息,但一个GET DIAGNOSTICS不会同时包含语句信息和错误信息,所以需要用两个GET DIA

【前端视野下的数据库概念探秘】——信息化人员必备知识面试宝典:解码“视图”与“游标”

【前端视野下的数据库概念探秘】——信息化人员必备知识&面试宝典:解码“视图”与“游标” 视图:数据的魔法透镜基本概念前端为何关心?代码示例:案例一功能使用思路 游标:数据流的指针基础认知前端视角代码示例:案例二使用技巧与注意事项 避坑指南:问题排查与解决方案视图性能慢游标处理不当 结语与思考 在前端开发的广阔天地里,我们通常翱翔于HTML、CSS、JavaScript的海洋,偶尔也