1

MSSQL から MySQL に移行しようとしています。この Stored Proc は、永続テーブルからいくつかの列の一時テーブルを作成し、カーソルを使用して各レコードの RandNum 列を乱数で更新し、データセットを選択します。これを書いているとき、カーソルをバイパスできると思ったのですが...

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

しかし、今はDBを変換しようとしているだけなので、あまり劇的に変更したくありません。後で戻って、これを最適化します。SP は次のとおりです:編集:この例から、エラーとは関係のないすべてのコードを削除しました。また、今日これをオンラインで見ましたが、この問題を抱えているのは私だけではないようです。MySQL は私のカーソル宣言の構文を好みません。何か案は?

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;//
4

1 に答える 1

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;

@cursor_idプロシージャで宣言された変数の代わりに、ユニット化されたセッション変数を使用していますcursor_id

次のように書き換えます。

  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;

または、最初に提案したように、一時テーブルをまったく削除してください。


この声明について:

しかし、今はDBを変換しようとしているだけなので、あまり劇的に変更したくありません。後で戻って、これを最適化します。

SQL Server大きく異なるプラットフォームMySQLです

切り替えることを決めたとき、あなたはすでにすべてを大幅に変更しています。

ほとんどの場合、古いコードをコピーしてMySQL.

SQL Server少なくとも同じプラットフォームのバージョン間である種の互換性を維持しようとする試みがあるため、のいくつかのバージョン間で動作する可能性がありますが、これは への移植には確実に機能しませんMySQL

私がすることは、コードのすべての部分を取り、できるだけ単純で予測可能な方法を使用して、古いコードと同じ結果が得られることを確認することです。

あなたの場合、@cursor_id変数はコードの早い段階で初期化される可能性があり、その値はストアド プロシージャによって使用される可能性があり、予期しない動作が発生する可能性があります。

これはSQL Server、変数にはバッチ スコープがあり、変数MySQLにはセッション スコープがあるためです。

于 2009-06-16T09:42:24.913 に答える