检查字段是否为连续、跨段、连续的奇数列或偶数列
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 阅读(284) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· 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