HeavenTang

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

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

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   HeavenTang  阅读(284)  评论(0编辑  收藏  举报

编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示