このMySqlカーソルコードで私を助けてください
-
05-07-2019 - |
質問
MSSQLからMySQLへの移行を試みています。このストアドプロシージャは、永続テーブルから一部の列の一時テーブルを作成し、カーソルを使用して各レコードの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;//
解決
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
ではセッションスコープがあるためです。