You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL创建插入记录存储过程触发语法错误问题求助

存在的语法错误

  • 两次提交的代码都存在存储过程名使用单引号包裹的问题:MySQL 中表名、存储过程名这类标识符需要用反引号(`)包裹,单引号仅用于标记字符串内容,会直接触发语法报错
  • 初始版本的INSERT语句的列名列表、VALUES列表末尾多了多余的逗号
  • MySQL 不存在@@ERROR系统变量,该变量是SQL Server的专属语法,MySQL 可以通过ROW_COUNT()函数判断DML语句执行影响的行数,也可以通过DECLARE HANDLER捕获执行异常
  • 初始版本中所有SQL语句末尾缺少分号结束符,包括INSERT语句、IF分支里的SET语句
  • 初始版本的IF分支语句缺少END IF关键字闭合
  • 混淆了OUT参数和用户变量:你定义的OUT参数是result,直接赋值即可,加上@前缀的是会话级用户变量@result,和你定义的OUT参数不是同一个变量
  • 存储过程不支持RETURN语句,RETURN仅可用于自定义函数,存储过程通过OUT参数天然返回结果,不需要额外RETURN
  • 第二次调整后的代码额外缺少INSERT语句末尾的分号结束符

修正后的完整代码(包含执行结果返回逻辑)

DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `login_insert`(
    IN uname VARCHAR(20),
    IN paword VARCHAR(20),
    OUT result INT
)
BEGIN
    -- 初始默认赋值为执行失败
    SET result = 5;
    INSERT INTO db1.login_tab (username, pword) VALUES (uname, paword);
    -- 判断插入是否成功
    IF ROW_COUNT() > 0 THEN
        SET result = 0;
    END IF;
END$$ 
DELIMITER ;

简化版本(不需要返回执行结果可直接使用)

DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `login_insert`(
    IN uname VARCHAR(20),
    IN paword VARCHAR(20)
)
BEGIN
    INSERT INTO db1.login_tab (username, pword) VALUES (uname, paword);
END$$ 
DELIMITER ;

内容的提问来源于stack exchange,提问作者Raghu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 12:36:03