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

如何在Laravel中捕获MySQL存储过程的SIGNAL错误?

问题描述

我有一个MySQL存储过程,当输入无效时会调用SIGNAL语句:

my_proc(IN in_val bigint unsigned, OUT out_val bigint unsigned)
BEGIN
    IF (in_val <= 0) THEN
        SIGNAL SQLSTATE '45000'
            SET MESSAGE_TEXT = 'Error!';
    END IF;
    SET out_val := in_val * 5;
END;

我在Laravel中这样调用该存储过程:

DB::select("call my_proc('" . $num . "', @returnVal)");
$data = DB::select('SELECT @returnVal as returnVal');

操作成功时返回的数据如下:

[0] => stdClass Object
     (
         [returnCode] => 100
     )

但触发SIGNAL错误时,仅返回:

[0] => stdClass Object
     (
         [returnCode] =>
     )

请问如何在Laravel端捕获该错误?

解决方案

1. 先修复SQL注入风险

当前直接拼接变量到SQL语句的写法存在严重SQL注入风险,必须改成参数绑定方式:

DB::select('call my_proc(?, @returnVal)', [$num]);

2. 用try-catch捕获异常

当存储过程触发SIGNAL语句时,Laravel的数据库查询会抛出Illuminate\Database\QueryException异常,通过try-catch块即可捕获并处理:

try {
    DB::select('call my_proc(?, @returnVal)', [$num]);
    $data = DB::select('SELECT @returnVal as returnVal');
    // 处理成功逻辑
    return $data[0]->returnVal;
} catch (\Illuminate\Database\QueryException $e) {
    // 匹配存储过程定义的SQLSTATE,处理自定义错误
    if ($e->getCode() === '45000') {
        // 获取SIGNAL设置的错误信息
        echo '存储过程错误:' . $e->getMessage();
        // 这里可以添加自定义错误处理逻辑,比如返回错误响应
    }
    // 处理其他类型的数据库异常
    echo '数据库错误:' . $e->getMessage();
}

关键说明

  • QueryException的getCode()方法会返回SIGNAL中定义的SQLSTATE值(如示例中的45000),可通过这个值精准判断是否为存储过程抛出的自定义错误。
  • getMessage()方法会返回SIGNAL里设置的MESSAGE_TEXT内容(如示例中的Error!)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 11:32:13