2009-06-16 3 views
1

Essayer de migrer de MSSQL à 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. Comme je l'écris ce que je pensais que je pouvais contourner le curseur et juste ...Aidez-moi avec ce code de curseur MySql

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

Mais je ne veux pas changer quoi que ce soit trop drastique, parce qu'en ce moment je suis juste essayer de convertir la DB. Je vais revenir en arrière et optimiser ce genre de choses plus tard. Voici le SP: EDIT: J'ai enlevé tout le code de cet exemple qui n'a rien à voir avec l'erreur. En outre, j'ai vu this en ligne aujourd'hui et il semble que je ne suis pas le seul à avoir 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;// 

Répondre

0
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 variable de session non initialisée @cursor_id au lieu de la variable cursor_id

déclaré procédure Rewrite 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 encore mieux, juste se débarrasser de votre table temporaire du tout, comme vous l'avez suggéré en premier lieu.


En ce qui concerne cette déclaration:

Mais je ne veux pas changer quoi que ce soit trop drastique, parce qu'en ce moment je suis juste essayer de convertir la DB. Je vais revenir en arrière et optimiser ce genre de choses plus tard.

SQL Server et MySQL sont largement différentes plates-formes.

Vous avez déjà tout changé trop radical quand vous avez décidé de changer.

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

Cela fonctionnerait probablement entre plusieurs versions de SQL Server, puisqu'il y a au moins des tentatives pour maintenir une sorte de compatibilité entre les versions de la même plate-forme, mais cela ne fonctionnera certainement pas pour le portage MySQL.

Ce que je voudrais faire est de prendre toutes les pièces de votre code et assurez-vous qu'il produit les mêmes résultats que l'ancien code a fait, en utilisant des méthodes aussi simple et prévisible que possible.

Dans votre cas, la variable @cursor_id pouvait être initialisée plus tôt dans le code et sa valeur pouvait être utilisée par la procédure stockée, ce qui entraînait tout type de comportement inattendu. Cela est dû au fait que dans SQL Server les variables ont une portée par lots, tandis que dans MySQL elles ont une portée de session.

+0

Ce n'est pas ce qui le brise, bien que cela soulève une autre question à laquelle vous pouvez répondre si vous le souhaitez: http: // stackoverflow.com/questions/1009954/mysql-variable-vs-variable-quoi-la-différence – DJTripleThreat