Question

Essayer de migrer de MSSQL vers MySQL. Ce processus stocké crée une table temporaire pour certaines colonnes à partir d'une table permanente, puis utilise un curseur pour mettre à jour la colonne RandNum de chaque enregistrement avec un nombre aléatoire et sélectionne l'ensemble de données. En écrivant cela, je pensais que je pouvais contourner le curseur et juste ...

SELECT Id, Title, DateStart, Rand() FROM cms_News;

Mais je ne veux rien changer de radical, car pour le moment, j'essaie simplement de convertir la base de données. Je vais revenir en arrière et optimiser ce genre de choses plus tard. Voici le SP: MODIFIER : j'ai supprimé tout le code de cet exemple qui n'a rien à voir avec l'erreur. De plus, j’ai vu cette en ligne aujourd'hui et il semble que je sois pas le seul qui a ce problème. MySQL n'aime pas la syntaxe de ma déclaration de curseur. Des idées?

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;//
Était-ce utile?

La solution

  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;

Vous utilisez une variable de session personnalisée @cursor_id au lieu de la variable déclarée par la procédure id_curseur

Réécrivez comme suit:

  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;

ou mieux encore, supprimez simplement votre table temporaire, comme vous l'avez suggéré en premier lieu.

En ce qui concerne cette déclaration:

  

Mais je ne veux rien changer de radical, car pour le moment, j'essaie simplement de convertir la base de données. Je vais revenir en arrière et optimiser ce genre de choses plus tard.

SQL Server et MySQL sont des plateformes très différentes .

Vous avez déjà tout changé trop radicalement lorsque vous avez décidé de changer de fournisseur.

Dans la plupart des cas, vous ne pouvez pas simplement copier votre ancien code et le marteler dans MySQL .

Cela fonctionnerait éventuellement entre plusieurs versions de SQL Server , car au moins des tentatives ont été faites pour maintenir une sorte de compatibilité entre les versions de la même plate-forme, mais cela ne fonctionnera certainement pas pour le portage vers MySQL .

Ce que je voudrais faire, c'est prendre chaque partie de votre code et vous assurer qu'il produit les mêmes résultats que l'ancien code, en utilisant des méthodes aussi simples et prévisibles que possible. .

Dans votre cas, la variable @cursor_id pourrait être initialisée plus tôt dans le code et sa valeur pourrait être utilisée par la procédure stockée, ce qui entraînerait tout type de comportement inattendu.

En effet, dans SQL Server , les variables ont une étendue de traitement par lots, alors que dans MySQL , elles ont une étendue de session.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top