从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错误:[存储过程参数不正确的数据类型]”。
答案 0 :(得分:0)
在我看来,由于传递了错误的参数,你的proc甚至都没有被执行;你只能通过捕获异常来处理你的PHP代码。
如果事实上正在调用proc,但由于某种数据类型不匹配而导致程序内部出现问题,则可以使用
BEGIN TRY
-- your proc statements here
END TRY
BEGIN CATCH
END CATCH
<强>更新强>
由于您说您需要为每个需要处理的记录调用一次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
?