oracle游标的使用方法:

①、定义游标 cursor

②、打开游标 open

③、提取游标 fetch

④、关闭游标 close

declare

--类型定义

cursor c_job

is

select empno,ename,job,sal

from emp

where job=‘MANAGER‘;

--定义一个游标变量

c_row c_job%rowtype;

begin

open c_job;

loop

--提取一行数据到c_row

fetch c_job into c_row;

--判读是否提取到值,没取到值就退出

--取到值c_job%notfound 是false

--取不到值c_job%notfound 是true

exit when c_job%notfound;

dbms_output.put_line(c_row.empno||‘-‘||c_row.ename||‘-‘||c_row.job||‘-‘||c_row.sal);

end loop;

--关闭游标

close c_job;

end;

create or replace function comm.fun_datediff

(p_Component varchar2 ,

p_Subtranhend date,

p_Minuend date)

RETURN NUMBER

IS

/*************************************************************************/

/* 功 能:返回两个日期之间的天、周、月、年等数量。 */

/* 入参说明: p_Component 时间元件,如年月日季度等等 */

/* p_Subtrahend 减数时间 */

/* p_Minuend 被减数时间 */

/*************************************************************************/

v_ReturnValue number ; -- 结果数值v_Component varchar2(10); --日期组件中间转换形式,截取空格并且转为大写v_YearNum1 number; --减数年份数v_YearNum2 number; --被减数年份数v_MonthNum1 number; --减数月份数v_MonthNum2 number; --被减数月份数v_HourNum1 number; --减数时数v_HourNum2 number; --被减数时数v_MinuteNum1 number; --减数分钟数v_MinuteNum2 number; --被减数分钟数v_SecondNum1 number; --减数秒钟数v_SecondNum2 number; --减数秒钟数v_QuarterValue1 number; --减数季度数v_QuarterValue2 number; --被减数季度数v_WeekNum1 number; --减数与标准时间周差v_WeekNum2 number; --被减数与标准时间周差BEGIN v_Component := upper(ltrim(rtrim(p_Component))); if v_Component in (‘Y‘,‘YY‘,‘YEAR‘,‘YYYY‘) then --年情况 v_YearNum1 := to_number(to_char(p_Subtranhend,‘YYYY‘)); v_YearNum2 := to_number(to_char(p_Minuend,‘YYYY‘)) ; v_ReturnValue := v_YearNum2 - v_YearNum1; elsif v_Component in (‘M‘, ‘MM‘,‘MONTH‘, ‘MON‘) then --月情况--请注意,这个部分与oracle内置日期函数MONTH_BETWEEN()不同,忽略了日因素--而后者的两个日期如都是所在月的最后一天,才返回整数,否则,返回分数--而且这个分数是以31天作为一个月进行计算的结果 v_YearNum1 := to_number(to_char(p_Subtranhend,‘YYYY‘)); v_YearNum2 := to_number(to_char(p_Minuend,‘YYYY‘)) ; v_MonthNum1 := to_number(to_char(p_Subtranhend,‘MM‘)); v_MonthNum2 := to_number(to_char(p_Minuend,‘MM‘)); v_ReturnValue := (v_YearNum2 - v_YearNum1)*12 + (v_MonthNum2 - v_MonthNum1); elsif v_Component in ( ‘D‘, ‘DD‘, ‘DAY‘) then --日情况--这里与两个日期直接相减的oracle日期算术也不同,只返回整数天数;--而后者可以返回一天的几分之几(以小数形式表达) v_ReturnValue := to_date(to_char(p_Minuend,‘yyyy-mm-dd‘),‘YYYY-MM-DD‘) - to_date(to_char(p_Subtranhend,‘yyyy-mm-dd‘),‘YYYY-MM-DD‘); elsif v_Component in (‘H‘, ‘HH‘, ‘HOUR‘) then --时情况--第一步:求出天数 v_ReturnValue := (to_date(to_char(p_Minuend,‘yyyy-mm-dd‘),‘YYYY-MM-DD‘) - to_date(to_char(p_Subtranhend,‘yyyy-mm-dd‘), ‘YYYY-MM-DD‘));--第二步:求出时数 v_HourNum1 := to_number(to_char(p_Subtranhend,‘HH24‘)); v_HourNum2 := to_number(to_char(p_Minuend,‘HH24‘)); v_ReturnValue := v_ReturnValue*24 + (v_HourNum2 - v_HourNum1);elsif v_Component in (‘MI‘,‘MINUTE‘) then --分情况 --第一步:求出天数 v_ReturnValue := (to_date(to_char(p_Minuend,‘yyyy-mm-dd‘),‘YYYY-MM-DD‘) - to_date(to_char(p_Subtranhend,‘yyyy-mm-dd‘), ‘YYYY-MM-DD‘)); --第二步:求出时数 v_HourNum1 := to_number(to_char(p_Subtranhend,‘HH24‘)); v_HourNum2 := to_number(to_char(p_Minuend,‘HH24‘)); v_ReturnValue := v_ReturnValue*24 + (v_HourNum2 - v_HourNum1); --第三步:求出分钟数 v_MinuteNum1 := to_number(to_char(p_Subtranhend,‘MI‘)); v_MinuteNum2 := to_number(to_char(p_Minuend,‘MI‘)); v_ReturnValue := v_ReturnValue*60 + (v_MinuteNum2 - v_MinuteNum1);elsif v_Component in(‘S‘, ‘SS‘, ‘SECOND‘) then --秒情况 --第一步:求出天数 v_ReturnValue := (to_date(to_char(p_Minuend,‘yyyy-mm-dd‘),‘YYYY-MM-DD‘) - to_date(to_char(p_Subtranhend,‘yyyy-mm-dd‘), ‘YYYY-MM-DD‘)); --第二步:求出时数 v_HourNum1 := to_number(to_char(p_Subtranhend,‘HH24‘)); v_HourNum2 := to_number(to_char(p_Minuend,‘HH24‘)); v_ReturnValue := v_ReturnValue*24 + (v_HourNum2 - v_HourNum1); --第三步:求出分钟数 v_MinuteNum1 := to_number(to_char(p_Subtranhend,‘MI‘)); v_MinuteNum2 := to_number(to_char(p_Minuend,‘MI‘)); v_ReturnValue := v_ReturnValue*60 + (v_MinuteNum2 - v_MinuteNum1); --第四步:求出秒钟数 v_SecondNum1 := to_number(to_char(p_Subtranhend,‘SS‘)); v_SecondNum2 := to_number(to_char(p_Minuend,‘SS‘)); v_ReturnValue := v_ReturnValue*60 + (v_SecondNum2 - v_SecondNum1);elsif v_Component in (‘Q‘,‘QQ‘,‘QUARTER‘) then --季度情况 v_YearNum1 := to_number(to_char(p_Subtranhend,‘YYYY‘)); v_YearNum2 := to_number(to_char(p_Minuend,‘YYYY‘)) ; v_QuarterValue1 := to_number(to_char(p_Subtranhend,‘Q‘)); v_QuarterValue2 := to_number(to_char(p_Minuend,‘Q‘)); v_ReturnValue := (v_YearNum2 - v_YearNum1)*4 + (v_QuarterValue2 - v_QuarterValue1);elsif v_Component in (‘W‘,‘WW‘,‘WK‘,‘WEEK‘) then --周情况--一周的起始日期应当为星期日--关于周差的计算,尝试采用中间日期的方法--经查,‘1-1-2’即公元一年1月2日为周日,我们就可以用两个时间分别与其相减求周差--两个结果再相减,即可得到正确的数值 v_WeekNum1 := floor( (to_date(to_char(p_Subtranhend,‘YYYY-MM-DD‘),‘YYYY-MM-DD‘) - to_date(‘1-1-2‘,‘YYYY-MM-DD‘))/7); v_WeekNum2 := floor( (to_date(to_char(p_Minuend,‘YYYY-MM-DD‘),‘YYYY-MM-DD‘) - to_date(‘1-1-2‘,‘YYYY-MM-DD‘))/7); v_ReturnValue := v_WeekNum2 - v_WeekNum1;else v_ReturnValue := -88888;end if;RETURN v_ReturnValue;EXCEPTIONWHEN OTHERS THENRETURN -99999;--例外处理END fun_datediff;

oracle游标理解,oracle游标的使用方法相关推荐

  1. oracle中判断空,Oracle中判断空游标的方法

    1.声明包 create or replace package TAL_TEST is -- Author : ADMINISTRATOR -- Created : 2012/12/9 15:15:3 ...

  2. oracle存储过程详解--游标 实现增、删、改、查的

    注:以下是转来的内容,但是设计PLSQL代码,原文有问题,所以PLSQL代码我都验证修改了.测试需要在scott/tiger下进行,对于没有的表,需要自行创建,表复制的语句为 CREATE TABLE ...

  3. oracle父游标和子游标,诊断Oracle high version count(高版本游标)问题

    什么是high version cursor(高版本游标)?对于一个特定的游标有多少个版本就属于高版本游标是没有明确定义的.对于不同的系统有不同 什么是high version cursor(高版本游 ...

  4. oracle创建多个游标,Oracle——游标的创建和使用

    游标 SQL语言是面向集合的,是对指定列的操作.如果要对列中的指定行进行操作,就必须使用游标. 当在PL/SQL块中执行查询语句(SELECT) 和数据操纵语句(DML) 时,Oracle会为其分配一 ...

  5. oracle用游标drop多个表,Oracle Procedure中使用游标cursor更新多表?

    Oracle中写Procedure一直是Oracle开发中比较复杂的地方,但是掌握procedure 和cursor将使得你在Oracle开发中如鱼的水,真正体会Oracle的强大.下面通过我自己写的 ...

  6. oracle中游标分类,Oracle 游标分类以及实例

    /*Oracle游标,从字面理解就是游动的光标.用数据库语言来描述就是:游标是映射在结果集中一行数据上的位置实体, 有了游标,用户就可以访问结果集中的任意一行数据了,将游标放置到某行后,即可对该行数据 ...

  7. Oracle 快速入门 触发器游标

    目录 一.触发器 1.什么是触发器(概念)? 2.创建触发器语法(史上最难的oracle语法,没有之一) 3. 触发器组成三部分: 4. 前触发与后触的原理图 5. 在级联表中创建触发器案例 二.程序 ...

  8. Oracle 11g Release 1 (11.1) 游标——显式游标

    http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/static.htm#CIHCAHJA 本文内容 声明一个游标 打开一个游标 用游标获取一个 ...

  9. 【Oracle】PL/SQL 显式游标、隐式游标、动态游标

    在PL/SQL块中执行SELECT.INSERT.DELETE和UPDATE语句时,Oracle会在内存中为其分配上下文区(Context Area),即缓冲区.游标是指向该区的一个指针,或是命名一个 ...

最新文章

  1. 拿下赌场新客户,但马斯克“超级隧道”何时才能颠覆地面交通?
  2. 现在使用计算机的工作原理是,计算机的工作原理是什么
  3. ABAP 锁对象与加锁机制
  4. 在windows下将Tomcat设置为自动启动的服务
  5. 动态规划(五) 最大连续子序列和(Maximum Continuous Subsequence Sum)
  6. mysql整理类型_MYSQL数据类型分析整理
  7. .net chart(图表)控件的使用
  8. PyTorch 深度学习:32分钟快速入门——DenseNet
  9. MFC添加View的方法
  10. bootstrapform表单重置_“bootstrap table”怎么重置表单?
  11. 微型计算机系统评课,微机课评课稿.pdf
  12. 解决方案之Android 国际化资源完美兼容6.0,7.0,8.0
  13. 关闭selinux的方法汇总
  14. 学人工智能需要什么基础?
  15. Spark算子实战Java版,学到了
  16. 关于对《三只松鼠》网站的诊断报告
  17. 盘点五款轻松提高工作效率的任务管理软件
  18. Git——eclipse中冲突的解决
  19. 外卖跑腿app源码,小程序上点餐+送货二合一
  20. 【web课程设计】用HTML+CSS做一个漂亮简单的动漫网页

热门文章

  1. C++--深入分析MFC文档视图结构(项目实践)
  2. 初中数学分几个模块_【初中数学】8大模块61个必考易错知识点!
  3. 猜测:引力与空间映射
  4. 底部菜单_css实现移动端底部导航菜单隆起效果
  5. 6.6 二分 K-Means 算法-机器学习笔记-斯坦福吴恩达教授
  6. 在VS中如保快速查看DLL或exe的已导出的函数
  7. 软件工程师学硬件-怎么看原理图之协议类接口UART
  8. react之bind函数到组件通识篇
  9. 一文读懂 JAVA 异常处理
  10. java基础(一) 深入解析基本类型