zoukankan      html  css  js  c++  java
  • 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_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;
    EXCEPTION
    WHEN OTHERS THEN
    RETURN -99999;--例外处理
    END fun_datediff;

  • 相关阅读:
    ASP.NET编程的十大技巧
    C#学习心得(转)
    POJ 1177 Picture (线段树)
    POJ 3067 Japan (树状数组)
    POJ 2828 Buy Tickets (线段树)
    POJ 1195 Mobile phones (二维树状数组)
    HDU 4235 Flowers (线段树)
    POJ 2886 Who Gets the Most Candies? (线段树)
    POJ 2418 Cows (树状数组)
    HDU 4339 Query (线段树)
  • 原文地址:https://www.cnblogs.com/shanzzs/p/10895046.html
Copyright © 2011-2022 走看看