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

来源:互联网 发布:js面向对象原型方式 编辑:程序博客网 时间:2024/04/29 06:24

为了提高号段匹配速度,提高匹配效率,使用索引表下标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 ;/ 

原创粉丝点击