在我的存储过程中处理此错误的正确方法是什么?

时间:2011-11-11 03:03:10

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

从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错误:[存储过程参数不正确的数据类型]”。

1 个答案:

答案 0 :(得分:0)

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

如果事实上正在调用proc,但由于某种数据类型不匹配而导致程序内部出现问题,则可以使用

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

Documentation here.

<强>更新

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

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

更新2

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

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

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