Frage

Der Versuch von MSSQL zu MySQL zu migrieren. Diese gespeicherte Proc schafft eine temporäre Tabelle für einige Spalten aus einer permanenten Tabelle dann einen Cursor mit jedem Datensatz des RandNum Spalte mit einer Zufallszahl zu aktualisieren, und wählt die Datenmenge. Als ich dies schreibe dachte ich, dass ich die Cursor umgehen konnte und nur ...

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

Aber ich mag nicht etwas zu drastisch ändern, denn im Moment bin ich nur die DB zu konvertieren versuchen. Ich gehe zurück und optimieren später dieses Zeug. Hier ist die SP: EDIT: ich die gesamten Code aus diesem Beispiel entfernt, die nichts mit dem Fehler zu tun hat. Auch ich sah diese heute online und es scheint, dass ich bin nicht die einzige, der dieses Problem hat. MySQL nicht wie die Syntax meiner Cursor-Deklaration. Irgendwelche Ideen?

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;//
War es hilfreich?

Lösung

  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;

Sie verwenden unitialized Sitzungsvariable @cursor_id statt Prozedur deklarierte Variable cursor_id

Rewrite wie folgt:

  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;

oder noch besser, nur um loszuwerden Ihre temporären Tabelle überhaupt, wie Sie in erster Linie vorgeschlagen.


Wie für diese Aussage:

  

Aber ich mag nicht etwas zu drastisch ändern, denn im Moment bin ich nur die DB zu konvertieren versuchen. Ich gehe zurück und optimieren diese Dinge später.

SQL Server und MySQL sind in beträchtlichem Ausmaß verschiedene Plattformen.

Sie haben schon alles zu drastisch geändert, wenn entschieden zu wechseln.

In den meisten Fällen können Sie nicht nur Ihren alten Code kopieren und Hammer MySQL.

Es wäre möglicherweise arbeiten zwischen mehreren Versionen von SQL Server, da zumindest gibt es Versuche, eine Art von Kompatibilität zwischen den Versionen von derselben Plattform zu halten, aber das wird auf jeden Fall nicht funktionieren MySQL für die Portierung.

Was ich tun würde, ist jedes Stück Code nehmen und sicherstellen, dass es die gleichen Ergebnisse erzeugt als der alte Code tat, mit Methoden so einfach und vorhersehbar wie möglich .

In Ihrem Fall die @cursor_id Variable im Code initialisiert früher werden kann und sein Wert konnte von der gespeicherten Prozedur verwendet werden, die auf jede Art von unerwartetem Verhalten führen würden.

Das ist, weil in SQL Server die Variablen Batch Umfang haben, während in MySQL sie Sitzungsbereich haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top