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