oracle游标的使用方法

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_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‘); elsif v_Component in (‘H‘,‘HH‘,‘HOUR‘) then --时情况--第一步:求出天数 v_ReturnValue := (to_date(to_char(p_Minuend,‘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‘)); --第二步:求出时数 v_HourNum1 := to_number(to_char(p_Subtranhend,‘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,‘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_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‘))/7); v_ReturnValue := v_WeekNum2 - v_WeekNum1;else v_ReturnValue := -88888;end if;RETURN v_ReturnValue;EXCEPTIONWHEN OTHERS THENRETURN -99999;--例外处理END fun_datediff;

相关文章

文章浏览阅读773次,点赞6次,收藏9次。【代码】c# json字符...
文章浏览阅读8.7k次,点赞2次,收藏17次。此现象一般定位到远...
文章浏览阅读2.8k次。mysql脚本转化为oracle脚本_mysql建表语...
文章浏览阅读2.2k次。cx_Oracle报错:cx_Oracle DatabaseErr...
文章浏览阅读1.1k次,点赞38次,收藏35次。本文深入探讨了Or...
文章浏览阅读1.5k次。默认自动收集统计信息的时间为晚上10点...