Ayúdame con este código de cursor MySql
-
05-07-2019 - |
Pregunta
Intentando migrar de MSSQL a MySQL. Este proceso almacenado está creando una tabla temporal para algunas columnas de una tabla permanente y luego utiliza un cursor para actualizar la columna RandNum de cada registro con un número aleatorio y selecciona el conjunto de datos. Mientras escribo esto, pensé que podía pasar por alto el cursor y solo ...
SELECT Id, Title, DateStart, Rand() FROM cms_News;
Pero no quiero cambiar nada demasiado drástico, porque ahora solo estoy tratando de convertir el DB. Volveré y optimizaré esto más tarde. Aquí está el SP: EDITAR: Eliminé todo el código de este ejemplo que no tiene nada que ver con el error. Además, he visto esto en línea hoy y parece que estoy No es el único que está teniendo este problema. MySQL no le gusta la sintaxis de mi declaración de cursor. ¿Alguna idea?
DELIMITER ;//
DROP PROCEDURE IF EXISTS `cms_NewsSelectMainPageNews`;//
CREATE PROCEDURE `cms_NewsSelectMainPageNews`
()
BEGIN
CREATE TEMPORARY TABLE tempNews
(
Id int NOT NULL,
Title nvarchar(250),
DateStart datetime,
RandNum float NULL
);
DECLARE Randomizer CURSOR
FOR SELECT Id FROM tempNews;
END;//
Solución
REPEAT
FETCH Randomizer INTO cursor_id;
IF NOT done THEN
UPDATE tempNews SET RandNum = rand();
WHERE id = @cursor_id;
END IF;
UNTIL done END REPEAT;
Está utilizando la variable de sesión unificada @cursor_id
en lugar de la variable declarada por el procedimiento cursor_id
Reescriba como sigue:
REPEAT
FETCH Randomizer INTO cursor_id;
IF NOT done THEN
UPDATE tempNews SET RandNum = rand();
WHERE id = cursor_id;
END IF;
UNTIL done END REPEAT;
o incluso mejor, simplemente deshazte de tu tabla temporal, como sugeriste en primer lugar.
En cuanto a esta declaración:
Pero no quiero cambiar nada demasiado drástico, porque ahora solo estoy tratando de convertir el DB. Volveré y optimizaré esto más adelante.
SQL Server
y MySQL
son enormemente diferentes plataformas.
Ya has cambiado todo demasiado drástico cuando decidiste cambiar.
En la mayoría de los casos, no puedes simplemente copiar tu código anterior e ir a MySQL
.
Posiblemente funcionaría entre varias versiones de SQL Server
, ya que al menos hay intentos de mantener algún tipo de compatibilidad entre las versiones de la misma plataforma, pero esto definitivamente no funcionará para portar MySQL
.
Lo que haría es tomar cada parte de su código y asegurarme de que produzca los mismos resultados que el código anterior, usando métodos de la forma más simple y predecible posible .
En su caso, la variable @cursor_id
podría inicializarse anteriormente en el código y su valor podría ser utilizado por el procedimiento almacenado, lo que daría lugar a cualquier tipo de comportamiento inesperado.
Esto se debe a que en SQL Server
las variables tienen un alcance por lotes, mientras que en MySQL
tienen un alcance de sesión.