-- Controlla validità del codice BBAN italiano -- Si veda http://www.morfoedro.it/doc.php?n=218&lang=it -- Copyright Alexandre Rodichevski 2003-2005 -- -- Linguaggio: PL/SQL -- Argomento: B - codice BBAN da validare -- Restituisce: NULL=argomento nullo, '0'=OK, '1'=lunghezza errata, -- '2'=simbolo non valido, '3'=simbolo non valido nella posizione 1, -- '4'=simbolo non valido nelle posizioni 2-11, '9'=errata somma di controllo -- create or replace function BBAN_IT_CHK ( B varchar2 -- codice BBAN da validare ) 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; -- somma di controllo begin -- Controlla lunghezza L := length(B); if B is NULL then return NULL; -- argomento nullo elsif length(B) <> 23 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 -- caso: cifra if C between 48 and 57 then if I = 1 then return '3'; -- simbolo errato nella posizione 1 end if; K := C - 48; -- caso: carattere maiuscolo elsif C between 65 and 90 then if I between 2 and 11 then return '4'; -- simbolo errato nelle posizioni 2-11 end if; K := C - 65; -- caso: altri simboli else return '2'; -- simbolo non valido end if; -- Calcola somma di controllo if I = 1 then KCIN := K; elsif I mod 2 = 1 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 BBAN_IT_CHK;