MySQL Forums
Forum List  »  MySQL Workbench

Trouble with script en Workbench 6.1.7311891
Posted by: Javier Guiducci
Date: October 01, 2014 09:48AM

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

Options: ReplyQuote


Subject
Views
Written By
Posted
Trouble with script en Workbench 6.1.7311891
1469
October 01, 2014 09:48AM


Sorry, you can't reply to this topic. It has been closed.

Content reproduced on this site is the property of the respective copyright holders. It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.