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

Laravel 10调用MariaDB存储过程报错,寻求语法问题解决方案

解决Laravel 10调用MariaDB存储过程的SQL语法错误问题

核心问题分析

你遇到的语法错误根源是MariaDB/MySQL不支持EXEC关键字(这是SQL Server的存储过程调用语法),同时存储过程调用必须用括号包裹参数,哪怕参数数量不为零。

正确调用方式

根据你的存储过程功能(返回状态码2或3),分两种情况处理:

情况1:存储过程通过SELECT返回结果集

如果你的存储过程是用SELECT 2或SELECT 3返回状态码,直接使用DB::select配合正确的CALL语法即可:

$result = DB::select('CALL SP_Account_Save_Registration(?,?,?,?)', [
    $arr['badge'],
    $arr['password'],
    $arr['email'],
    $arr['mobile']
]);
// 结果集中会包含返回的状态码,比如 $result[0]->status(取决于存储过程SELECT的字段名)
dd($result);

情况2:存储过程使用输出参数返回状态码

如果存储过程定义了OUT类型的参数(例如SP_Account_Save_Registration(IN badge VARCHAR(20), IN password VARCHAR(255), IN email VARCHAR(100), IN mobile VARCHAR(20), OUT status INT)),需要先调用存储过程,再查询会话变量获取结果:

// 调用存储过程,绑定输入参数,指定输出变量@status
DB::statement('CALL SP_Account_Save_Registration(?,?,?,?,@status)', [
    $arr['badge'],
    $arr['password'],
    $arr['email'],
    $arr['mobile']
]);

// 查询会话变量获取返回的状态码
$status = DB::selectOne('SELECT @status AS status')->status;
dd($status);

为什么之前的尝试失败?

  • 使用EXEC关键字:MariaDB不识别该语法,必须替换为CALL。
  • 调用时省略括号:MySQL/MariaDB要求存储过程调用必须用CALL proc(参数)的格式,不能写成CALL proc 参数。
  • 错误使用DB::insert/DB::statement:DB::insert仅用于插入语句,而DB::statement不会返回结果集,如果存储过程是通过SELECT返回值,必须用DB::select。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 11:35:18