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;

  • 相关阅读:
    [论文理解] MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
    [论文理解] Connectionist Text Proposal Network
    [期末复习] 数据结构期末复习
    [机器视觉] 实际场景字提取
    [论文理解]Deep Residual Learning for Image Recognition
    [学习笔记] AD笔记
    [OpenMP] 并行计算入门
    [Docker] Docker安装和简单指令
    python初级装饰器编写
    web页面简单布局的修改,测试中的应用
  • 原文地址:https://www.cnblogs.com/shanzzs/p/10895046.html
Copyright © 2011-2022 走看看