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;//
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top