oracle 索引表下标使用VARCHAR2类型判断主叫号码

为了提高号段匹配速度,提高匹配效率,使用索引表下标VARCHR2类型匹配电话号是非常方便快捷的。下面是我工作中使用的方法,希望大家共同探讨。

CREATE OR REPLACE PROCEDURE PC_HAOR_DEAL_SECT IS ---------------------------------------------------------------------------------------------- -- Copyright(c) 2007 : 黑龙江省通信公司支撑共享中心.郝锐.版权所有 ---------------------------------------------------------------------------------------------- -- Program Name      : 去除相同地区重复号段0-9情况 ---------------------------------------------------------------------------------------------- -- This VerSion      : 1.10.00 -- Creator By        : HR    Time:2007/08/02 -- Modify by         :         Time: -- Modify by         :         Time: -- Last Modify by    : -- Last Modify cause : --                   : --                   : --******************************************************************************************-- /*TYPE RD IS RECORD (    TEL_SECT JFJS_HR_UNC_SECT.TEL_SECT%TYPE,    AREA_CODE JFJS_HR_UNC_SECT.AREA_CODE%TYPE    ); */ TYPE T_SECT IS TABLE OF NUMBER INDEX BY VARCHAR2(16); T_TAB T_SECT; --操作内存表

KEY INTEGER; V_BOUND VARCHAR2(16); V_L VARCHAR2(16); V_AREA_CODE NUMBER;

BEGIN      --提取号段到内存表    FOR RE IN (SELECT DISTINCT TEL_SECT,AREA_CODE               FROM JFJS_HR_UNC_SECT               ORDER BY TEL_SECT)    LOOP      T_TAB(RE.TEL_SECT):=RE.AREA_CODE;    END LOOP;

    --处理重复号段操作 处理有上级号段------------------------------------------    V_L:=T_TAB.FIRST;    WHILE V_L IS NOT NULL LOOP      IF T_TAB.EXISTS(SUBSTR(V_L,1,LENGTH(V_L)-1))      OR T_TAB.EXISTS(SUBSTR(V_L,1,LENGTH(V_L)-2))      OR T_TAB.EXISTS(SUBSTR(V_L,1,LENGTH(V_L)-3))      OR T_TAB.EXISTS(SUBSTR(V_L,1,LENGTH(V_L)-4))      OR T_TAB.EXISTS(SUBSTR(V_L,1,LENGTH(V_L)-5))      OR T_TAB.EXISTS(SUBSTR(V_L,1,LENGTH(V_L)-6))      THEN      --如果存在上一级号段则删除当前下一级的号段           T_TAB.DELETE(V_L);      END IF;      V_L:=T_TAB.NEXT(V_L);    end loop;

   --处理没有上级号段重复地址尾号段是0-9的情况--------------------------------- for h in 0..4 loop --处理添加缩位号段后重新满足重复号段的情况    V_L:=T_TAB.FIRST;    WHILE V_L IS NOT NULL LOOP     --保存area_code 值      V_AREA_CODE :=T_TAB(V_L);      --判断号段是否满足重复条件      KEY :=0;        FOR I IN 0..9 LOOP      BEGIN          IF (  T_TAB.EXISTS(SUBSTR(V_L,1,LENGTH(V_L)-1)||TO_CHAR(I)) )             AND             ( V_AREA_CODE=T_TAB(SUBSTR(V_L,1,LENGTH(V_L)-1)||TO_CHAR(I))  )          THEN          KEY :=KEY +1;          END IF;      END;      END LOOP;      --如果满足重复条件,全部删除      IF KEY =10 THEN         FOR J IN 0..9 LOOP         T_TAB.DELETE(SUBSTR(V_L,1,LENGTH(V_L)-1)||TO_CHAR(J)) ;         END LOOP;         --缩位追加         T_TAB(SUBSTR(V_L,1,LENGTH(V_L)-1)):=V_AREA_CODE ;      END IF;

   V_L:=T_TAB.NEXT(v_l);      END LOOP;    end loop;      --替换源表数据    DELETE  FROM tmp_haor ;    COMMIT;       V_BOUND:=T_TAB.FIRST;    WHILE V_BOUND IS NOT NULL LOOP      INSERT INTO tmp_haor(AREA_CODE,TEL_SECT)      VALUES(T_TAB(V_BOUND),V_BOUND);      COMMIT;      V_BOUND:=T_TAB.NEXT(V_BOUND);    END LOOP;    END ; /  

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值