pl/sql 函数之判断多个分割的数字是否在某个范围
2017-12-10 23:43
211 查看
CREATE OR REPLACE FUNCTION validate_zone_contain (zone_value VARCHAR2,zone1 VARCHAR2,delimiter varchar2)
RETURN BOOLEAN IS
v_flag BOOLEAN;
v_zone VARCHAR2(500);
v_zone1 VARCHAR2(500);
i NUMBER := 1;
c_i NUMBER := 1;
j NUMBER := 1;
k NUMBER := 1;
c_k NUMBER := 1;
h NUMBER := 1;
v_zone_value NUMBER;
v_zone_start NUMBER;
v_zone_end NUMBER;
BEGIN
-- 区域
v_zone := RTrim(LTrim(zone_value, delimiter), delimiter);
v_zone1 := RTrim(LTrim(zone1, delimiter), delimiter);
v_flag := TRUE;
LOOP
i := InStr(v_zone, delimiter, j);
c_i := InStr(v_zone, delimiter, j);
IF v_flag AND i> 0 THEN
v_zone_value := to_number(Trim(SubStr(v_zone, j, i-j)));
j := i+1;
LOOP
k := InStr(v_zone1, delimiter, h);
-- 多个值时 K > 0 (112,113)
IF k>0 THEN
v_zone_start := to_number(Trim(SubStr(v_zone1, h, k-h)));
v_zone_end := to_number(Trim(SubStr(v_zone1, h, k-h)))+100;
IF v_zone_value < v_zone_start OR v_zone_value > v_zone_end THEN
v_flag := FALSE;
END IF;
k := h+1;
ELSIF c_k >0 AND k = 0 THEN -- c_k 避免k遍历最后一个报错
v_zone_start := to_number(TRIM(v_zone1));
v_zone_end := v_zone_start+100;
IF v_zone_value < v_zone_start OR v_zone_value > v_zone_end THEN
v_flag := FALSE;
END IF;
END IF;
EXIT WHEN k=0;
END LOOP;
ELSIF v_flag AND c_i > 0 AND i= 0 THEN
v_zone_value := to_number(v_zone);
LOOP
k := InStr(v_zone1, delimiter, h);
IF k>0 THEN
v_zone_start := to_number(Trim(SubStr(v_zone1, h, k-h)));
v_zone_end := to_number(Trim(SubStr(v_zone1, h, k-h)))+100;
IF v_zone_value < v_zone_start OR v_zone_value > v_zone_end THEN
v_flag := FALSE;
END IF;
k := h+1;
ELSIF c_k >0 AND k = 0 THEN
v_zone_start := to_number(TRIM(v_zone1));
v_zone_end := v_zone_start+100;
IF v_zone_value < v_zone_start OR v_zone_value > v_zone_end THEN
v_flag := FALSE;
END IF;
END IF;
EXIT WHEN k=0;
END LOOP;
END IF;
EXIT WHEN i=0 OR v_flag = FALSE;
END LOOP;
RETURN v_flag;
END;
RETURN BOOLEAN IS
v_flag BOOLEAN;
v_zone VARCHAR2(500);
v_zone1 VARCHAR2(500);
i NUMBER := 1;
c_i NUMBER := 1;
j NUMBER := 1;
k NUMBER := 1;
c_k NUMBER := 1;
h NUMBER := 1;
v_zone_value NUMBER;
v_zone_start NUMBER;
v_zone_end NUMBER;
BEGIN
-- 区域
v_zone := RTrim(LTrim(zone_value, delimiter), delimiter);
v_zone1 := RTrim(LTrim(zone1, delimiter), delimiter);
v_flag := TRUE;
LOOP
i := InStr(v_zone, delimiter, j);
c_i := InStr(v_zone, delimiter, j);
IF v_flag AND i> 0 THEN
v_zone_value := to_number(Trim(SubStr(v_zone, j, i-j)));
j := i+1;
LOOP
k := InStr(v_zone1, delimiter, h);
-- 多个值时 K > 0 (112,113)
IF k>0 THEN
v_zone_start := to_number(Trim(SubStr(v_zone1, h, k-h)));
v_zone_end := to_number(Trim(SubStr(v_zone1, h, k-h)))+100;
IF v_zone_value < v_zone_start OR v_zone_value > v_zone_end THEN
v_flag := FALSE;
END IF;
k := h+1;
ELSIF c_k >0 AND k = 0 THEN -- c_k 避免k遍历最后一个报错
v_zone_start := to_number(TRIM(v_zone1));
v_zone_end := v_zone_start+100;
IF v_zone_value < v_zone_start OR v_zone_value > v_zone_end THEN
v_flag := FALSE;
END IF;
END IF;
EXIT WHEN k=0;
END LOOP;
ELSIF v_flag AND c_i > 0 AND i= 0 THEN
v_zone_value := to_number(v_zone);
LOOP
k := InStr(v_zone1, delimiter, h);
IF k>0 THEN
v_zone_start := to_number(Trim(SubStr(v_zone1, h, k-h)));
v_zone_end := to_number(Trim(SubStr(v_zone1, h, k-h)))+100;
IF v_zone_value < v_zone_start OR v_zone_value > v_zone_end THEN
v_flag := FALSE;
END IF;
k := h+1;
ELSIF c_k >0 AND k = 0 THEN
v_zone_start := to_number(TRIM(v_zone1));
v_zone_end := v_zone_start+100;
IF v_zone_value < v_zone_start OR v_zone_value > v_zone_end THEN
v_flag := FALSE;
END IF;
END IF;
EXIT WHEN k=0;
END LOOP;
END IF;
EXIT WHEN i=0 OR v_flag = FALSE;
END LOOP;
RETURN v_flag;
END;
相关文章推荐
- t-sql判断一个字符串是否为bigint的函数(全角数字需要判断为不合格)
- 十二、函数能够判断一个数字是否是一个素数(并给出一个范围求出这个范围内所有的素数)
- t-sql判断一个字符串是否为bigint的函数(全角数字需要判断为不合格)
- 在sql 数据库中,用脚来判断字符串是否为数字的函数
- t-sql判断一个字符串是否为bigint的函数(全角数字需要判断为不合格)
- MS SQL Server中数据表、视图、函数/方法、存储过程是否存在判断及创建
- sql 判断 函数 存储过程是否存在的方法
- C#(用函数判断输入的值是否是数字)[转载]
- oracle中判断一个字符串是否全部为数字的函数
- Android 判断是否是数字及数字的范围
- sqlserver判断是否为数字的函数
- 利用JDK函数判断字符串是否数字的几种方法
- 【转】js判断输入是否中文,数字,身份证等等js函数
- Sql判断是否为数字类型
- js如何判断输入是否为正整数、浮点数等数字的函数
- postgresql数据库中判断是否是数字和日期时间格式函数
- sql 判断函数、存储过程是否存在的代码整理
- jQuery 判断是否为数字的方法 及 转换数字函数
- 在delphi中判断字符串是否数字,以及精度处理函数
- SQL判断某列中是否包含中文字符、英文字符、纯数字 (转)