gpt4 book ai didi

mysql - 帮我解决这个 MySql 游标代码

转载 作者:行者123 更新时间:2023-11-30 23:43:09 25 4
gpt4 key购买 nike

尝试从 MSSQL 迁移到 MySQL。此存储过程正在为永久表中的某些列创建临时表,然后使用游标使用随机数更新每个记录的 RandNum 列并选择数据集。在我写这篇文章时,我想我可以绕过光标,然后......

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

但我不想做太大的改变,因为现在我只是想转换数据库。稍后我会回去优化这些东西。这是 SP:编辑: 我从这个例子中删除了所有与错误无关的代码。另外,我看到了 this今天在线,看来我不是唯一遇到此问题的人。 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;

您正在使用未初始化的 session 变量 @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;

或者更好的是,完全摆脱临时表,正如您一开始所建议的那样。


至于这个声明:

But i dont want to change anything too drastic, because right now I'm just trying to convert the DB. I will go back and optimize this stuff later.

SQL ServerMySQL非常不同的平台。

当你决定转换时,你已经把一切都改变得太彻底了。

在大多数情况下,您不能只是复制旧代码并将其锤炼到 MySQL

它可能会在多个版本的 SQL Server 之间工作,因为至少有尝试在同一平台的版本之间保持某种兼容性,但这肯定不适用于移植到MySQL

我会做的是获取你的每一段代码,并确保它产生与旧代码相同的结果,使用尽可能简单和可预测的方法 .

在您的情况下,@cursor_id 变量可以在代码的前面初始化,并且它的值可以由存储过程使用,这将导致任何类型的意外行为。

这是因为在 SQL Server 中,变量具有批处理范围,而在 MySQL 中,它们具有 session 范围。

关于mysql - 帮我解决这个 MySql 游标代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1000466/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com