zoukankan      html  css  js  c++  java
  • 检查字段是否为连续、跨段、连续的奇数列或偶数列

    oracle 自定义函数 检查字段是否为连续、跨段、连续的奇数列或偶数列
    --示例:Str(1,2,3,5,6,7), 返回Result(1-3周,5-7周);
    -- Str(1,3,5,7), 返回Result(1-7单周);
    -- Str(2,4,6,8), 返回Result(2-8双周);
    -- 其他返回Result(Str);

    `
    CREATE OR REPLACE FUNCTION "CHECKNUMSEQ1"(str IN VARCHAR2) RETURN VARCHAR2 IS
    p_num NUMBER DEFAULT 0; --计数器
    p_cnt NUMBER DEFAULT 1; --循环游标时的标识,相当于数组下标
    p_firstr VARCHAR2(5); --循环游标时保存第一行的值
    p_prer VARCHAR2(5); --循环游标时保存前一行的值
    p_result VARCHAR2(300);

    BEGIN

    SELECT COUNT(1) INTO p_num FROM TABLE(strsplitretarr(str, ','));

    IF p_num > 1 THEN
    FOR x IN (SELECT column_value AS v_num FROM TABLE(strsplitretarr(str, ',')) ORDER BY to_number(column_value)) LOOP
    --获得第一行
    IF p_cnt = 1 THEN
    p_firstr := x.v_num;
    END IF;
    --如果后一个数字减去前一个数字不等于1 ,就是不连续区域
    IF p_cnt > 1 AND to_number(x.v_num - p_prer) <> 1 THEN

        IF p_firstr = p_prer THEN
          p_result := p_result || p_firstr || ';';
        ELSE
          p_result := p_result || p_firstr || '-' || p_prer || ';';
        END IF;
    
        p_firstr := x.v_num;
      END IF;
      --获得最后一行
      IF p_cnt = p_num THEN
    
        IF to_number(x.v_num - p_prer) = 1 THEN
          p_result := p_result || p_firstr || '-' || x.v_num || ';';
        END IF;
    
        IF to_number(x.v_num - p_prer) <> 1 THEN
          IF p_firstr = p_prer THEN
            p_result := p_result || p_firstr || ';' || x.v_num || ';';
          ELSE
            p_result := p_result || x.v_num || ';';
          END IF;
        END IF;
      END IF;
      p_cnt  := p_cnt + 1;
      p_prer := x.v_num;
    END LOOP;
    
    SELECT rtrim(p_result, ';') INTO p_result FROM dual;
    

    ELSE
    p_result := str;
    END IF;

    --检测是否为奇数列或偶数列
    SELECT oddoreven(p_result) INTO p_result FROM dual;

    RETURN(p_result);
    EXCEPTION
    WHEN OTHERS THEN
    dbms_output.put_line(':程序运行出现内部错误,请联系管理员。' || dbms_utility.format_error_backtrace() || SQLCODE ||
    '---' || SQLERRM);
    END checknumseq1;
    `

    非常感谢某个同事的贡献

  • 相关阅读:
    CentOS 5.5如何通过yum安装Zend Optimizer
    如何更改商品分类名称的长度?
    ECSHOP的后台路径修改
    SVN协同开发时服务端与线上APACHE测试环境网站同步记录 转
    一个简单的替换字符的SQL命令
    svn 的常见操作 import
    SVN制作补丁包的方法
    kloxo密码解决办法
    SVN的分支/标记/合并
    如何将一个表中的所有字母都变成小写
  • 原文地址:https://www.cnblogs.com/heavenTang/p/13920921.html
Copyright © 2011-2022 走看看