Ze względu na coraz większą liczbę prefiksów nie jest już łatwo ustalić czy dany nr jest komórkowy czy też stacjonarny. Posiłkując się Wikipedią postanowiłem napisać zgrabną funkcję zwracającą 1 jeśli podamy jako argument nr komórkowy lub zero w przeciwnym przypadku.
Założenia są następujące:
- obsługujemy tylko polskie numery telefoniczne
- wszystkie znaki które nie są cyframi usuwane są w trakcie walidacji
- wiodące zera, liczba 48 i dowolna liczba zera po numerze kierunkowym Polski są usuwane
- sprawdzam, czy otrzymany łańcuch zawiera dokładnie 9 znaków i rozpoczyna sie od którejś z cyfr 5,6,7 lub 8
- zgodnie z danymi z Wikipedii sprawdzam czy dwa pierwsze znaki zgadzają się z dwoma pierwszymi znakami prefiksów z Wikipedii (dlaczego dwa, a nie trzy znaki - proponuję pogłówkować Czytelnikom)
Dobrym pomysłem będzie zaszycie jako parametr wyrażenia regularnego do sprawdzania prefiksów..
CREATE OR REPLACE FUNCTION Fdb_IsGSMNumber( pc_Arg VARCHAR2) RETURN NUMBER
AS
vc_Bufor VARCHAR2(15 CHAR);
BEGIN
vc_Bufor := REGEXP_REPLACE( REGEXP_REPLACE(pc_Arg, '[^[:digit:]]', ''), '^0*(48){0,1}0*', '');
IF LENGTH(vc_Bufor) <> 9 OR SUBSTR( vc_Bufor, 1,1) NOT BETWEEN '5' AND '8' THEN
RETURN 0;
END IF;
IF REGEXP_SUBSTR ( vc_Bufor, '^(5[0,1,3,7]|6[0,6,9]|7[2,3,8,9]|88)') IS NULL THEN
RETURN 0;
END IF;
RETURN 1;
EXCEPTION WHEN OTHERS THEN
RETURN 0;
END;
/