gpt4 book ai didi

mysql - 无法在存储过程中声明变量

转载 作者:行者123 更新时间:2023-11-29 13:20:03 25 4
gpt4 key购买 nike

我无法在存储过程中声明 mysql 变量。我也无法打开光标,并且不断收到相同的错误:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@userID INT; DECLARE @cursorUserID CURSOR FOR SELECT (MAX(userID) + 1) FROM Use' at line 3.

代码如下:

use phpBank;
DELIMITER //
CREATE PROCEDURE newUser()
BEGIN
DECLARE @userID INT;
DECLARE @cursorUserID CURSOR FOR SELECT (MAX(userID) + 1) FROM Users;
OPEN @newUserID;
END;
//
DELIMITER ;

最佳答案

  1. 正如其他人已经提到的,您正在混合局部变量(变量名称前面没有 @)和用户( session )变量(具有 @ 在变量名前面)。 DECLARE 用于局部变量。 session 变量始终可用且不需要声明。

  2. 最好不要为变量和过程参数指定与表中的列名称相同的名称。当 MySQL 无法决定使用变量或列的实际含义时,它很容易破坏您的代码。

  3. 绝对不需要游标(与 Oracle 中的 plsql 不同)通过在您的程序中使用聚合函数 (MAX()) 来返回标量值案件)。只需将选择放在括号中即可。

话虽这么说,代码的语法正确版本可能如下所示

DELIMITER $$
CREATE PROCEDURE newUser()
BEGIN
DECLARE newid INT;

SET newid = (SELECT COALESCE(MAX(userID), 0) + 1 FROM Users);
SELECT newid;
END$$
DELIMITER ;

或者从技术上讲,您也可以这样做(但不推荐)

DELIMITER $$
CREATE PROCEDURE newUser()
BEGIN
SET @newid = (SELECT COALESCE(MAX(userID), 0) + 1 FROM Users);
SELECT @newid newid;
END$$
DELIMITER ;

这里是SQLFiddle 演示

<小时/>

现在,从过程名称和您尝试使用它的查询推断出来,看起来您正在重新发明手动生成唯一 ID(很可能是 PK)的过程。 停下来!不要这样做。它会产生竞争条件,并且在并发环境中无法正常工作,因为多个进程可能会获取相同的 MAX(userID) 值。

在 MySQL 中生成唯一 ID 的唯一安全方法是 auto_increment 列。请使用它。

关于mysql - 无法在存储过程中声明变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20966732/

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