Está en la página 1de 2

CREATE OR REPLACE FUNCTION validar_dui(character varying DEFAULT NULL::character varying) RETURNS boolean AS $BODY$ --****************************************************************************** -- NOMBRE : VALIDAR_DUI -- PROPOSITO

: VALIDAR SI EL NUMERO DE DUI ES VALIDO, DEVUELVE TRUE O F ALSE -- AUTOR : alberto.arevalo -- ALCANCE : ESTA FUNCION TIENE POR OBJETO ALERTAR AL MOMENTO DE INGR ESAR DATOS DEL CLIENTE SI EL DUI ES CORRECTO O NO --- FECHA : 28/MARZO/2010 -- NOTA ESPECIAL : (Esta funcion debera ser utulizada con ecepciones porque no siempre se tendran duis validos) --****************************************************************************** DECLARE vnEs_Valido boolean := true; vnSuma numeric(18,2) := 0; vnValor numeric(18,2) := 9; vnDiv numeric(18,2) := 0; vnMul numeric(18,2) := 0; vnResta numeric(18,2) := 0; vnDigito numeric(18,2) := 0; vnI INTEGER := 1; vnR INTEGER; vnH INTEGER; pcDUI ALIAS FOR $1; BEGIN BEGIN vnR := 0; --Valida que no sea menor que 9 caracteres IF LENGTH(pcDUI)<>9 THEN vnES_VALIDO := false; END IF; FOR vnI IN 1..9 LOOP --Valida que todos sean numeros. BEGIN vnH :=to_number(SUBSTR(pcDUI,vnI,1),'9'); EXCEPTION WHEN NO_DATA_FOUND THEN vnR := 1; WHEN OTHERS THEN vnR := 1; END; END LOOP; --Multiplica las primeras 8 pocisiones(individualmente) por la variable VVALOR, y --acumula los valores en la variable VSUMA. IF vnR = 0 THEN FOR vnI IN 1..8 LOOP vnSUMA := vnSUMA + to_number(SUBSTR(pcDUI,vnI,1),'9')*vnVALOR ; vnVALOR := vnVALOR - 1; END LOOP; --Realiza operaciones matematicas para determinar si el DUI es correct o. vnDIV := MOD(vnSUMA,10);

vnRESTA := 10 - vnDIV; IF vnRESTA = 10 THEN vnRESTA := 0; END IF; --Si el resultado de la variable VRESTA es 0, el DUI es correcto. IF vnRESTA <> to_number(SUBSTR(pcDUI,9,1),'9') THEN vnES_VALIDO := false; END IF; IF vnRESTA = to_number(SUBSTR(pcDUI,9,1),'9') THEN vnES_VALIDO := true; END IF; ELSE vnES_VALIDO := false; END IF; EXCEPTION WHEN NO_DATA_FOUND THEN vnES_VALIDO := false; END; RETURN vnES_VALIDO; END ; $BODY$ LANGUAGE plpgsql VOLATILE

También podría gustarte