【Oralce】oralce字符窜转变为数组

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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值