Blog programisty w Oracle PL/SQL

Jest to blog eksperymentatora programisty w PL/SQL dla Oracle. Wszystkie kody tutaj zamieszczone mogą być dowolnie wykorzystywane i zmieniane. A jeśli Ktoś z Gości znajdzie błąd, będę niezwykle wdzięczny...
Zapisz

Szukaj na tym blogu

piątek, 23 maja 2014

Czy to numer z cegły - wyrażenia regularne w praktyce c.d.

Dawno dawno temu, kiedy monitory komputerów były  bursztynowe, myszki miały ogonki i wkroczyła do Polski sieć NMT - posiadanie  wielkiej cegłówki przy pasku to był wówczas szczyt snobizmu. Z czasem jednak zwiększyła się liczba sieci , prefiksów...
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)
Osiągnięte rozwiązanie jest bardzo łatwo rozszerzalne o kolejne prefiksy i w sposób nadzwyczaj zwięzły opisuje wiele prefiksów. Wyrażenie. 5[0,1,3,7] oznacza prefiksy 50, 51, 53, 57.
Dobrym pomysłem będzie zaszycie jako parametr  wyrażenia regularnego do sprawdzania prefiksów..

CREATE OR REPLACE FUNCTION Fdb_IsGSMNumber( pc_Arg VARCHAR2RETURN 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;
/