-- Controlla validità del codice fiscale italiano -- Si veda http://it.geocities.com/arodichevski/comp-cf-it.html -- Copyright Alexandre Rodichevski 2003-2005 -- -- Argomento: B - codice fiscale da validare -- Restituisce: NULL=argomento nullo, '0'=OK, '1'=lunghezza errata, -- '2'=simbolo non valido, '9'=errata somma di controllo -- create or replace function CF_CHK ( B varchar2 -- codice fiscale da controllare ) return varchar2 is -- restituisce codice errore type num_varr_t is varray(32767) of number; -- tabella contributo delle posizioni dispari C_CF_CHK constant num_varr_t := num_varr_t(1, 0, 5, 7, 9, 13, 15, 17, 19, 21, 2, 4, 18, 20, 11, 3, 6, 8, 12, 14, 16, 10, 22, 25, 24, 23); L pls_integer; -- lunghezza stringa C pls_integer; -- codice del carattere corrente K pls_integer; -- codice normalizzato 0..25 KCIN pls_integer; -- codice di controllo normalizzato S pls_integer := 0; -- codice di controllo begin -- Controlla lunghezza L := length(B); if B is NULL then return NULL; -- argomento nullo elsif length(B) <> 16 then return '1'; -- lunghezza errata end if; -- Ciclo tra i caratteri della stringa for I in 1 .. L loop -- Estrae codice ASCII del prossimo carattere C := ascii( substr(B, I, 1) ); -- Normalizza il codice al range 0..25 if C between 48 and 57 then -- caso: cifra K := C - 48; elsif C between 65 and 90 then -- caso: carattere maiuscolo K := C - 65; else -- caso: altri simboli return '2'; -- simbolo non valido end if; -- Calcola somma di controllo if I = L then KCIN := K; elsif I mod 2 = 0 then S := S + K; else S := S + C_CF_CHK(K+1); end if; end loop; -- Controlla validità della somma di controllo if S mod 26 <> KCIN then return '9'; -- controllo fallito end if; return '0'; -- codice OK end CF_CHK;