Perl DBI 语句句柄和错误处理

标签 perl dbi

假设我有一个连接到数据库的子例程。然后我想进行查询并接收输出并对其进行处理,当然,但是如果查询无效怎么办?

所以让我们假设我有类似的东西:

$dbh = DBI->connect(<db>, <user>, <pass>);
$query = 'select a, b, c from table';
$sth = $dbh->prepare($query);
$sth->execute();

我意识到我也可以使用“做”,但这对我来说更容易理解。因此,在“表”没有“c”列的情况下,查询将无效,从而使句柄 $sth 无效并无法执行。对吧?

现在,万一出现这样的故障,$sth 会怎样?我不能对其调用 finish,因为它无效。

最佳答案

So in a scenario where "table" doesn't have a column "c", the query would be invalid, making the handle $sth invalid and failing to execute. Right?

不清楚您所说的“无效”是什么意思。

一些驱动程序,比如 DBD::Oracle,可能会在调用 prepare 时将 SQL 语句发送到服务器,在这种情况下,服务器会检测到错误并 prepare 将失败,返回一个 undef。 (另请参阅@Borodin 关于 RaiseError 的注释。)

如果在调用 prepare 时驱动程序没有将语句发送到服务器,则驱动程序会创建并返回一个语句句柄,其中存储了语句字符串。

Now, in case of a failure as such, what happens to $sth? I can't call finish on it, because it is invalid.

同样,您所说的“无效”是什么意思还不清楚。 (我发现尝试真正清楚我正在思考的概念和情况很有帮助。强制自己这样做通常意味着我找到了自己问题的答案,因为“问题”是在我使用的词中。)

因此,正如我上面所描述的,prepare 失败并返回了一个 undef(或者由于 RaiseError 而抛出异常 - 推荐),或者 prepare 返回了一个有效的 $sth .

如果 prepare 返回一个 undef,那么当您尝试调用 execute 时,perl 将抛出异常。

如果 prepare 返回一个有效的 $sth 然后 execute 将被调用,语句将被发送到服务器,服务器将检测到错误,并且 execute 将返回 false(如果设置了 RaiseError,则抛出异常 - 推荐)。

我绝不会称$sth为“无效”。要么你根本没有 $sth 因为 prepare 失败,要么你有一个 $sth 完全有效但在执行时遇到错误。

在这种情况下,调用 $sth->finish 会起作用,但正如@ThisSuitIsBlackNot 正确指出的那样,这将毫无意义。 (我应该在很多年前将 finish 重命名为 discard_pending_rows。)

关于Perl DBI 语句句柄和错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31890805/

相关文章:

arrays - 在 Perl DBI 中使用数组插入 1 行和很多列

mysql - Perl将许多插入语句插入mysql数据库

perl - 解释 Perl DBI MySQL column_info()

php - Perl 中与 PHP 的 print_r() 等价的是什么?

perl - 在哈希内部存储哈希的名称

perl - 如何使用模板工具包检查数组中是否存在元素

Perl 创建 SSL 套接字在 1020 个套接字后失败并显示 "Bad hostname"

mysql - 如何逐行从大表中获取数据

perl - 如何为具有不同数量参数的 DBI 更新编写子例程?

mysql - 记录集迭代