HeavenTang

导航

检查字段是否为连续、跨段、连续的奇数列或偶数列

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;
`

非常感谢某个同事的贡献

posted on 2020-11-03 16:17  HeavenTang  阅读(226)  评论(0编辑  收藏  举报