游标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

相关文章

ORACLE语法-包(package)、存储过程(procedure)、游标(cursor)以及java对Result结果集的处理

陈科肇 示例: 包规范 CREATE OR REPLACE PACKAGE PACK_WMS_YX IS-- Author : CKZ-- Created : 2015/8/28 9:52:29-- Purpose : 同步数据-- Public type declarations,游标 退休订单TYPE retCursor IS REF CURSOR;-- RETURN vi_co_co

Oracle(PL/SQL编程基础(PL/SQL程序块与PL/SQL语句)、异常、游标、数据类型)

一、PL/SQL Procedure Language/SQL是一门编程语言,Oracle公司对SQL进行了扩展,扩展后的SQL,就叫PL/SQL,功能更强大,面向过程语言,模块化编程语言,用于开发基于数据库的应用程序。下面关于PL/SQL编程基础主要介绍两点PL/SQL程序块于PL/SQL语句。 1、PL/SQL程序块 PL/SQL程序的基本单元,按照指定的方式,进行定义的

ABAP CURSOR游标的应用1

【应用场景】BW模块定时增量抽取SAP的销售案场收款单的业务主数据 【关键语法】 FUNCTION ZBWFM_ZTSD0011 .*"----------------------------------------------------------------------*"*"本地接口:*"  IMPORTING*"     VALUE(I_REQUNR) TYPE  SRSC

Oracle Procedure中使用游标cursor更新多表

Oracle Procedure中使用游标cursor更新多表 2007-04-20 16:51:43 分类: Oracle Oracle中写Procedure一直是Oracle开发中比较复杂的地方,但是掌握procedure 和cursor将使得你在Oracle开发中如鱼的水,真正体会Oracle的强大。下面通过我自己写的一个Procedure简单就procedure和cursor

AI写的不用游标派发明细数量例子

需求: 请在sqlserver设计数据库表以及编写sql实现如下需求:有个课目奖金表,登记各课目奖金池; 一个班有36位学生,每人每课目成绩不同,按学号顺序,如果成绩在90-100之间奖励200块,80-89之间奖励100块,70-79之间奖励50,其他不奖励,要考虑奖金是否派完的情况,最好不要用游标实现。首先,学生表要有金额字段,先更新金额字段然后显示这个表内容和各课目奖金池剩余金额 其实这

0011 数据库 游标

游标概念:游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条SQL选择语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。   个人理解: 游标:根据用户的需要筛

SQLserver中的游标的分类和游标的生命周期

SQLserver中的游标的分类 在 SQL Server 中,游标(Cursor)是一种数据库对象,用于逐行处理结果集中的数据。游标可以用于复杂的数据处理任务,尤其是那些不能通过简单的 SELECT 语句和 JOIN 操作完成的任务。SQL Server 提供了几种类型的游标,每种游标都有其特定的用途和性能特点。 只进游标 DECLARE STOCK_CURSOR CURSOR LOC

《SQL必知必会——第20、21、22课:管理事物处理、使用游标、高级sql特性》

第20课 管理事物处理        使用事务处理,通过确保成批的sql操作要么完全执行,要么完全不执行,来维护数据库的完整性。假如像微博加关注这样的场景,a关注b, a增加一个关注者,b增加一个粉丝,这个过程至少需要执行两条sql语句,如果两条只有一条执行成功,显然产生了脏数据,要么a的数据不对、要么b的数据不对。要保证整个操作完整,就要用到事物,上面场景,如果某一条出错,使用事

一文解决全部Oracle数据库的游标问题

一、什么是游标? 游标是一种数据库处理技术,允许查询结果集出来之前对其进行处理和操作。游标可以分为静态和动态游标2种类型。 静态游标在查询结果集出来之后不会改变,而动态游标则会随着数据库的变化而变化。 二、Oracle有2种的游标 1. 显式游标     是工程师明确声明的游标,允许程序员控制如何处理查询结果集。显式游标的优势是可以逐行处理查询结果集,而不是一次性将整

mssql2000游标循环次数对不上,如何解决??

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 问题描述   mssql2000游标循环次数对不上。 CREATE proc usp_ins_requisite_sc @bill char(16)