Anotacion: Funcion Valida Rut Chile Oracle
hay momentos en que para que inventar la rueda y ya esta inventada o no? todos los jiles dicen eso... pero te reto a que construyas tu propio algoritmo de rut tomando las consideraciones basicas que exije este.. ojala lo hicieras en algún lenguaje que no sea conocido phyton, sap o cualquier tipo de lenguaje y lo compartas con nosotros.
create or replace FUNCTION VALIDARUT(RUT IN VARCHAR2)RETURN VARCHAR2
AS
TOTAL VARCHAR2(12); -- largo total del string a ingresar (rut)
VRUT VARCHAR2(12); -- rut modificado para ajustar el largo
UNO VARCHAR2(2); -- primer valor del rut
DOS VARCHAR2(2); -- segundo valor del rut
TRES VARCHAR2(2);-- tercer valor del rut
CUATRO VARCHAR2(2); -- cuarto valor del rut
CINCO VARCHAR2(2); -- quinto valor del rut
SEIS VARCHAR2(2); -- ..
SIETE VARCHAR2(2); -- ..
OCHO VARCHAR2(2); -- ..
DV VARCHAR2(2); -- digito verificador
ULTIMO VARCHAR2(2); -- ultimo valor del rut ingresado
ESTADO NUMBER(2); -- estado simulacion booleano
BEGIN
ESTADO := 0; -- iniciamos el estado por defecto en falso
TOTAL := LENGTH(RUT); -- tomamos el total de la cadena
IF TOTAL = 12 OR TOTAL = 11 THEN -- comprovamos que no sea mayor a 12 y menor a 11
IF TOTAL <= 11 THEN -- verificamos
VRUT:=LPAD(RUT,12,0); -- agregamos 0 para ajustar a la nececidad de 12 digitos
ELSE
VRUT := RUT; -- asignamos valor final
END IF;
-- En VRUT se guardara el RUT FINAL
-- FILTRO "AMATEUR" PARA QUE EL FORMATO SEA EL CORRECTO
-- SOLO SE PERMITE EL SIGUIENTE FORMATO XX.XXX.XXX-X SI NO ES ASI DEVUELVE 0.
-- BASADO EN LOS VALORES ASCII DE CADA DIGITO.
IF
ASCII(SUBSTR(TO_CHAR(VRUT),1,1))>=48 AND ASCII(SUBSTR(TO_CHAR(VRUT),1,1)) <= 57 AND
ASCII(SUBSTR(TO_CHAR(VRUT),2,1))>=48 AND ASCII(SUBSTR(TO_CHAR(VRUT),2,1)) <= 57 AND
ASCII(SUBSTR(TO_CHAR(VRUT),3,1))= 46 AND
ASCII(SUBSTR(TO_CHAR(VRUT),4,1))>=48 AND ASCII(SUBSTR(TO_CHAR(VRUT),4,1)) <= 57 AND
ASCII(SUBSTR(TO_CHAR(VRUT),5,1))>=48 AND ASCII(SUBSTR(TO_CHAR(VRUT),5,1)) <= 57 AND
ASCII(SUBSTR(TO_CHAR(VRUT),6,1))>=48 AND ASCII(SUBSTR(TO_CHAR(VRUT),6,1)) <= 57 AND
ASCII(SUBSTR(TO_CHAR(VRUT),7,1))= 46 AND
ASCII(SUBSTR(TO_CHAR(VRUT),8,1))>=48 AND ASCII(SUBSTR(TO_CHAR(VRUT),8,1)) <= 57 AND
ASCII(SUBSTR(TO_CHAR(VRUT),9,1))>=48 AND ASCII(SUBSTR(TO_CHAR(VRUT),9,1)) <= 57 AND
ASCII(SUBSTR(TO_CHAR(VRUT),10,1))>=48 AND ASCII(SUBSTR(TO_CHAR(VRUT),10,1)) <= 57 AND
ASCII(SUBSTR(TO_CHAR(VRUT),11,1))= 45 AND
ASCII(SUBSTR(TO_CHAR(VRUT),12,1))>=48 AND ASCII(SUBSTR(TO_CHAR(VRUT),12,1)) <= 57
OR ASCII(SUBSTR(TO_CHAR(LOWER(VRUT)),12,1))=107 THEN --K
-- ALGORTIMO 2 DE http://www.dcc.uchile.cl/~mortega/microcodigos/validarrut/algoritmo.html
UNO := (SUBSTR(VRUT,1,1)*8); -- 1
DOS := (SUBSTR(VRUT,2,1)*9); -- 1
TRES := (SUBSTR(VRUT,4,1)*4); -- 2
CUATRO := (SUBSTR(VRUT,5,1)*5); --2
CINCO := (SUBSTR(VRUT,6,1)*6); --2
SEIS := (SUBSTR(VRUT,8,1)*7); --3
SIETE := (SUBSTR(VRUT,9,1)*8); --3
OCHO := (SUBSTR(VRUT,10,1)*9); -- 3
TOTAL := UNO + DOS + TRES + CUATRO + CINCO + SEIS + SIETE + OCHO; --SUMAMOS TODOS LOS VALORES
DV :=MOD(TOTAL,11); -- OBTENEMOS EL DV
--####-K 10699370-K
ULTIMO:= SUBSTR(VRUT,12,1); -- OBTENEMOS EL ULTIMO DIGITO DEL RUT
--- K
IF ASCII(SUBSTR(TO_CHAR(SUBSTR(LOWER(VRUT),12,1)),1,1)) = 107 THEN --OBTENEMOS SI EL VALOR INGRESADO TERMINA EN K
IF DV = 10 THEN
RETURN(1);
END IF;
END IF;
IF ULTIMO = DV THEN --COMPROVAMOS SI EL ULTIMO DIGITO ES IGUAL AL DV
ESTADO:=1; -- CAMBIAOS EL ESTADO DE FALSO A VERDADERO
RETURN(ESTADO); -- RETORNAMOS EL ESTADO SI TODO ESTA OK
END IF;
END IF;
END IF; -- end if, si el largo esta en el rango de 11 u 12
RETURN(ESTADO); -- RETORNAMOS EL VALOR FALSO.
END;
dejen comentarios....