Trouble with script en Workbench 6.1.7311891
Hello,
I have a script but I can´t find the error in the syntax and I don´t understand why happened. I paste my code
/* DEFINIR VARIABLES */
SET @TARJETA = '453296644395572';
SET @LONGITUD_INGRESO = 15;
SET @TARJETA_SIN_BLANCOS = '';
SET @ID = 0;
SET @DIGITO = 0;
SET @CONT = 0;
SET @MAXLEN = 0;
SET @RESULT = 99; -- 99 = NÚMERO DE TARJETA NO VÁLIDO
-- DEFINIR TABLAS TEMPORALES
CREATE TEMPORARY TABLE TARJETA_MULTIPLICADA
(
ID INT NOT NULL auto_increment
, DIGITO INT
, PRIMARY KEY (ID)
);
CREATE TEMPORARY TABLE TOTAL
(
ID INT NOT NULL auto_increment
, VALOR INT
, PRIMARY KEY (ID)
);
/* VERIFICAR SI LA LONGITUD DE LA TARJETA ES VÁLIDA */
IF (LENGTH(@TARJETA) >= @LONGITUD_INGRESO) THEN
-- /* INICIALIZAR CONTADORES */
SET @CONT = 1;
SET @MAXLEN = LENGTH(@TARJETA);
WHILE @CONT <= @MAXLEN DO
/* LIMPIAR LOS ESPACIOS EN BLANCO SI LOS HAY */
IF (SUBSTRING(@TARJETA, @CONT, 1) <> ' ') THEN
SET @TARJETA_SIN_BLANCOS = @TARJETA_SIN_BLANCOS + SUBSTRING(@TARJETA, @CONT, 1);
END IF;
/* AVANZAR AL PRÓXIMO DÍGITO */
SET @CONT = @CONT + 1;
END WHILE;
/* VERIFICAR TARJETA SIN ESPACIOS EN BLANCO */
/*--SELECT @TARJETA_SIN_BLANCOS;*/
/* VERIFICAR SI LA LONGITUD DE LA TARJETA SIGUE SIENDO VÁLIDA Y SON TODOS NÚMEROS */
IF (LENGTH(@TARJETA_SIN_BLANCOS) >= @LONGITUD_INGRESO)
AND (@TARJETA_SIN_BLANCOS NOT LIKE '%[^0-9]%') THEN
/* INICIALIZAR CONTADORES */
SET @CONT = 1;
SET @MAXLEN = LENGTH(@TARJETA_SIN_BLANCOS);
WHILE @CONT <= @MAXLEN DO
IF ((@CONT % 2) = 0) THEN
/* POSICIÓN PAR QUEDA EL NÚMERO COMO ESTÁ */
INSERT INTO TARJETA_MULTIPLICADA
(
DIGITO
)
(
SELECT CAST(SUBSTRING(@TARJETA_SIN_BLANCOS, @CONT, 1) AS SIGNED)
);
ELSE
/* POSICIÓN IMPAR MULTIPLICO POR 2 */
INSERT INTO TARJETA_MULTIPLICADA
(
DIGITO
)
(
SELECT 2 * CAST(SUBSTRING(@TARJETA_SIN_BLANCOS, @CONT, 1) AS SIGNED)
);
END IF;
/* AVANZAR AL PRÓXIMO DÍGITO */
SET @CONT = @CONT + 1;
END WHILE;
/* VISUALIZAR LA TARJETA DEPURADA */
/*--SELECT TD.ID, TD.DIGITO FROM TARJETA_MULTIPLICADA TD;*/
/* INICIALIZAR LOS CONTADORES */
SET @CONT = 0;
SET @MAXLEN = 0;
/* ASIGNAR VALORES A LOS CONTADORES */
SELECT @CONT = MIN(ID) FROM TARJETA_MULTIPLICADA;
SELECT @MAXLEN = MAX(ID) FROM TARJETA_MULTIPLICADA; /* LA CANTIDAD DEBE SER 15 Ó 18 */
/* RECORRER Y DISTRIBUIR DIGITOS */
WHILE @CONT <= @MAXLEN DO
SELECT
@DIGITO = TM.DIGITO
FROM TARJETA_MULTIPLICADA TM
WHERE (TM.ID = @CONT);
IF (@DIGITO > 9) THEN
/* INSERTAR PRIMER DÍGITO */
INSERT INTO TOTAL
(
VALOR
)
(
SELECT CAST(SUBSTRING(CAST(@DIGITO AS CHAR(2)),1,1) AS SIGNED)
);
/* INSERTAR SEGUNDO DÍGITO */
INSERT INTO TOTAL
(
VALOR
)
(
SELECT CAST(SUBSTRING(CAST(@DIGITO AS CHAR(2)),2,1) AS SIGNED)
);
ELSE
INSERT INTO TOTAL
(
VALOR
)
(
SELECT @DIGITO
);
END IF;
/* LIMPIAR VARIABLE */
SET @DIGITO = 0;
/* AVANZAR AL PRÓXIMO ROW */
SET @CONT = @CONT + 1;
END WHILE;
/* VISUALIZAR LA TARJETA TOTALIZADA */
/*--SELECT T.ID, T.VALOR FROM TOTAL T;*/
/* CALCULAR EL DIGITO VERIFICADOR */
SELECT
/*-- @RESULT = CAST((10 - (SUM(VALOR) % 10)) AS INT)*/
@RESULT = CASE WHEN LEN(CAST(CAST((10 - (SUM(VALOR) % 10)) AS SIGNED) AS CHAR(2))) > 1 THEN
0
ELSE
CAST((10 - (SUM(VALOR) % 10)) AS SIGNED)
END
FROM TOTAL;
/* BORRAR LOS DATOS DE LAS TABLAS AUXILIARES */
DELETE FROM TARJETA_MULTIPLICADA;
DELETE FROM TOTAL;
/* ELIMINAR LAS TABLAS AUXILIARES */
DROP TABLE TARJETA_MULTIPLICADA;
DROP TABLE TOTAL;
/* VISUALIZAR EL DÍGITO VERIFICADOR */
-- SELECT @RESULT;
END IF;
END IF;
SELECT @RESULT;
I hope that you can help me to resolve this problem.
I tried with a user function but it didn´t run.
I have this function in SQL Server and it run correctly; the function receive un string of 15 digits and it back only one digit.
Thank you very much
Javier