DELIMITER $$ CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`testCIF`(vCIF VARCHAR(9)) RETURNS varchar(10) CHARSET utf8mb3 COLLATE utf8mb3_unicode_ci DETERMINISTIC BEGIN DECLARE vLetraInicial VARCHAR(1); DECLARE vLetraFinal VARCHAR(1); DECLARE vParteNumerica VARCHAR(7); DECLARE vSuma INT DEFAULT 0; DECLARE vNumero INT DEFAULT 0; DECLARE i INT DEFAULT 0; DECLARE vResult BOOL DEFAULT FALSE; SET vLetraInicial = SUBSTR(vCIF, 1, 1); SET vLetraFinal = SUBSTR(vCIF, 9, 1); SET vParteNumerica = SUBSTR(vCIF, 2, 7); WHILE i < 7 DO SET i = i + 1; SET vNumero = CAST(SUBSTR(vParteNumerica, i, 1) AS DECIMAL(1,0)); IF i MOD 2 THEN SET vNumero = vNumero * 2; SET vNumero = vNumero MOD 10 + FLOOR(vNumero/10); END IF; SET vSuma = vSuma + vNumero; END WHILE; SET vSuma = vSuma MOD 10; IF vSuma > 0 THEN SET vSuma = 10 - vSuma; END IF; -- Comprobación de dígito de control IF CAST(vLetraFinal AS DECIMAL(1,0)) = vSuma THEN SET vResult = TRUE; END IF; IF vSuma = 0 THEN SET vSuma = 10; END IF; IF CHAR(64 + vSuma) = vLetraFinal THEN SET vResult = TRUE; END IF; -- Sólo se aceptan letras como caracter inicial IF ASCII(vLetraInicial) < 65 OR ASCII(vLetraInicial) > 87 THEN -- Ha de ser entre la A y la W SET vResult = FALSE; END IF; RETURN vResult; END$$ DELIMITER ;