-- Controlla validità della partita IVA italiana -- Si veda http://www.morfoedro.it/doc.php?n=221&lang=it -- Copyright Alexandre Rodichevski 2003-2005 -- -- Linguaggio: PL/SQL -- Argomento: B - partita IVA da validare -- Restituisce: NULL=argomento nullo, '0'=OK, '1'=lunghezza errata, -- '2'=simbolo non valido, '9'=errata somma di controllo -- create or replace function PIVA_CHK ( B varchar2 -- partita IVA da controllare ) return varchar2 is -- restituisce codice errore type num_varr_t is varray(32767) of number; -- Contributo nel codice di controllo C_PIVA_CHK constant num_varr_t := num_varr_t(0, 2, 4, 6, 8, 1, 3, 5, 7, 9); L pls_integer; -- lunghezza stringa C pls_integer; -- codice del carattere corrente K pls_integer; -- codice normalizzato 0..9 S pls_integer := 0; -- codice di controllo begin -- Controlla lunghezza L := length(B); if B is NULL or B = '00000000000' then return NULL; -- argomento nullo elsif length(B) <> 11 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..9 if C between 48 and 57 then -- caso: cifra K := C - 48; else -- caso: altri simboli return '2'; -- simbolo non valido end if; -- Calcola somma di controllo if I mod 2 = 1 then S := S + K; else S := S + C_PIVA_CHK(K+1); end if; end loop; -- Controlla validità della somma di controllo if S mod 10 <> 0 then return '9'; -- controllo fallito end if; return '0'; -- codice OK end PIVA_CHK;