CREATE OR REPLACE PACKAGE mip_regions IS -- Author : HARDYA -- Created : 20/11/2007 14:18:26 -- Purpose : /** Attempts to validate that the format of the given string matches a standard postcode format This includes the general format of the string, plus any restrictions on character values within the overall format. %param p_string the string whose format is to be checked %return TRUE if the given string matches a known postcode format */ FUNCTION valid_postcode_format(p_postcode IN VARCHAR2) RETURN BOOLEAN; END mip_regions; / CREATE OR REPLACE PACKAGE BODY mip_regions IS /** Attempts to determine whether general the format the given string to match a standard postcode format %param p_string the string whose format is to be checked %return a known postcode format or NULL if the string did not match a known postcode format {*} ANbNAA e.g. M1 1AA {*} ANNbNAA e.g. M60 1NW {*} AANbNAA e.g. CR2 6XH {*} AANNbNAA e.g. DN55 1PT {*} ANAbNAA e.g. W1A 1HP {*} AANAbNAA e.g. EC1A 1BB */ FUNCTION reformat_postcode_string(p_string IN VARCHAR2) RETURN VARCHAR2 IS l_return VARCHAR2(8); BEGIN IF regexp_like(srcstr => p_string ,pattern => '^[[:upper:]][[:digit:]]} [[:digit:]][[:upper:]]{2}$') THEN l_return := 'AN NAA'; ELSIF regexp_like(srcstr => p_string ,pattern => '^[[:upper:]][[:digit:]]{2} [[:digit:]][[:upper:]]{2}$') THEN l_return := 'ANN NAA'; ELSIF regexp_like(srcstr => p_string ,pattern => '^[[:upper:]]{2}[[:digit:]] [[:digit:]][[:upper:]]{2}$') THEN l_return := 'AAN NAA'; ELSIF regexp_like(srcstr => p_string ,pattern => '^[[:upper:]]{2}[[:digit:]]{2} [[:digit:]][[:upper:]]{2}$') THEN l_return := 'AANN NAA'; ELSIF regexp_like(srcstr => p_string ,pattern => '^[[:upper:]][[:digit:]][[:upper:]] [[:digit:]][[:upper:]]{2}$') THEN l_return := 'ANA NAA'; ELSIF regexp_like(srcstr => p_string ,pattern => '^[[:upper:]]{2}[[:digit:]][[:upper:]] [[:digit:]][[:upper:]]{2}$') THEN l_return := 'AANA NAA'; END IF; RETURN l_return; END reformat_postcode_string; /** Attempts to validate that the format of the given string matches a standard postcode format This includes the general format of the string, plus any restrictions on character values within the overall format. %param p_string the string whose format is to be checked %return TRUE if the given string matches a known postcode format */ FUNCTION valid_postcode_format(p_postcode IN VARCHAR2) RETURN BOOLEAN IS l_return BOOLEAN := TRUE; l_postcode_format VARCHAR2(8); BEGIN IF p_postcode = 'GIR 0AA' THEN l_return := TRUE; ELSIF length(p_postcode) NOT IN (6 ,7 ,8) THEN l_return := FALSE; ELSE l_postcode_format := reformat_postcode_string(p_postcode); IF l_postcode_format IS NULL THEN l_return := FALSE; ELSE IF instr('QVX' ,substr(p_postcode ,1 ,1)) > 0 THEN l_return := FALSE; ELSIF substr(l_postcode_format ,2 ,1) = 'A' AND instr('IJZ' ,substr(p_postcode ,2 ,1)) > 0 THEN l_return := FALSE; ELSIF substr(l_postcode_format ,3 ,1) = 'A' AND instr('ABCDEFGHJKSTUW' ,substr(p_postcode ,3 ,1)) = 0 THEN l_return := FALSE; ELSIF substr(l_postcode_format ,4 ,1) = 'A' AND instr('ABCDEFGHJKSTUW' ,substr(p_postcode ,4 ,1)) = 0 THEN l_return := FALSE; ELSE -- letters CIKMOV are not used in the second part of the postcode FOR l_idx IN instr(l_postcode_format ,' ') .. length(l_postcode_format) LOOP IF substr(l_postcode_format ,l_idx ,1) = 'A' AND instr('CIKMOV' ,substr(p_postcode ,l_idx ,1)) > 0 THEN l_return := FALSE; END IF; END LOOP; END IF; END IF; END IF; RETURN l_return; END valid_postcode_format; /** Find the region with which the given postcode is associated %param p_postcode correctly formatted postcode %return region code */ FUNCTION get_region_for_postcode(p_postcode IN VARCHAR2) RETURN postcodes.regi_code%TYPE IS l_regi_code postcodes.regi_code%TYPE; BEGIN SELECT regi_code INTO l_regi_code FROM (SELECT regi_code ,outcode ,incode ,decode(outcode || ' ' || incode ,p_postcode ,1 ,999) AS accuracy FROM postcodes t WHERE (outcode || ' ' || incode = p_postcode) OR (outcode = substr(p_postcode ,1 ,instr(p_postcode ,' ') - 1) AND incode IS NULL) ORDER BY 4) WHERE rownum < 2; RETURN l_regi_code; EXCEPTION WHEN no_data_found THEN RETURN NULL; END get_region_for_postcode; BEGIN -- Initialization NULL; END mip_regions; /