【问题标题】:What is the proper way to handle this error in my stored procedure?在我的存储过程中处理此错误的正确方法是什么?
【发布时间】:2011-12-26 17:06:51
【问题描述】:

我从 PHP 调用 SQL 存储过程。存储过程检查数据库,如果数据是新的,则插入数据,或者修改已存在的数据。

我收到一个错误,指出我的参数之一的数据类型不正确。由于数据的来源,我无法真正控制这一点。我在一个数据数组中循环调用存储过程数百次或数千次,但我只在批处理中的几条记录中收到此错误。

在存储过程中处理此错误的正确方法是什么?如果任何参数的数据类型不正确,我只想跳过该记录并继续下一条记录。每个调用都来自一个 foreach 循环。

数据库正在报告错误并且 PHP 正在显示它。我没有处理错误的经验。

示例 PHP 代码:

foreach($item_array as $item) {
    $id = $item['id'];
    $color = $item['color'];

    $con = connect()
    $query = 'EXECUTE PROCEDURE sp_update_db(:id, :color);'
    $params = array(':id' => $id, ':color' => $color);
    $stmt = prepare($con, $query);

    $result = execute($stmt, $params);

    close($con);
}

运行代码我得到“警告:SQL 错误:[存储过程参数的数据类型不正确]”。

【问题讨论】:

    标签: php sql stored-procedures advantage-database-server


    【解决方案1】:

    在我看来,由于传递了错误的参数,您的 proc 甚至没有被执行;您只能通过捕获异常来处理您的 php 代码。

    如果实际上正在调用 proc,但由于某种数据类型不匹配而在过程内部失败,则可以使用

    BEGIN TRY
        -- your proc statements here
    END TRY
    BEGIN CATCH
    END CATCH
    

    Documentation here.

    更新

    由于您说过要为每个需要处理的记录调用一次 proc,因此您需要在 PHP 端捕获错误。您可以在 PHP 上使用 try/catch 块。 See here

    基本上,您需要在foreach 循环中放置try/catch 块,仅包含调用存储过程的部分; 然而,我只需要在存储过程调用之前有一个if 语句,以确保将传递给proc 的所有参数都是预期的类型和长度。例如,如果存储过程需要int 类型的参数@a,如果要传递的参数不是数字或空字符串,我将完全阻止调用proc。

    更新 2

    基于示例 php(警告:我不是 PHP 编码器),看起来这样可以:

    try{
        $result = execute($stmt, $params);
    }
    catch (Exception $e) {
    }
    

    但同样,如果您知道 proc 期望的数据类型,为什么不使用 if 而不是 try/catch

    【讨论】:

    • 数据库报错,PHP正在显示。
    • @MikeJerome 所以你的问题是当发生错误时你不知道如何继续循环遍历剩余的项目?
    • 我以前从来没有处理过错误,所以我不知道我是在存储过程中捕获它,还是在我的 foreach 循环中捕获它,或者我是否必须在存储过程中捕获它并且返回一些东西给 PHP 或什么。
    • 我在想我应该在存储过程中使用 Try Catch,但我还需要做些什么吗?
    猜你喜欢
    • 1970-01-01
    • 2020-12-02
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    相关资源
    最近更新 更多