假设我有一个连接到DB的子程序.然后我想做一个查询并接收输出并用它做一些事情,当然,但是如果查询无效怎么办?
所以我们假设我有类似的东西:
$dbh = DBI->connect(<db>, <user>, <pass>);
$query = 'select a, b, c from table';
$sth = $dbh->prepare($query);
$sth->execute();
Run Code Online (Sandbox Code Playgroud)
我意识到我也可以使用"做",但这对我来说更容易理解.因此,在"table"没有列"c"的情况下,查询将无效,使得句柄$ sth无效并且无法执行.对?
现在,如果发生故障,$ sth会发生什么?我无法打电话给它,因为它无效.
这是迄今为止最好的做事方式.坚持prepare(你只需要做一次)execute并避免do.您还应该使用问号作为查询的任何参数的占位符,并将调用中的值传递给execute.除此之外,这种方式可以为您处理任何必要的值引用
呼叫finish或是disconnect必要的是非常罕见的.你应该把它们留下来,直到你DBI更好地了解自己的方式
你是正确的,$sth将是undef和错误代码和错误信息会被返回$dbh->err和$dbh->errstr.此外,默认情况下PrintError会设置该选项,DBI如果执行中出现任何错误,则会生成警告.如果您希望程序完全停止,请禁用PrintError并启用RaiseError
除此之外,它确实取决于您在出错时的选择.例如,一些错误可能是可恢复的,在这种情况下,您可以禁用这两个 PrintError 和 RaiseError和测试返回值是否为undef.然后你可能会根据返回的错误代码执行一些操作$dbh->err
我希望有所帮助
因此,在"table"没有列"c"的情况下,查询将无效,使得句柄$ sth无效并且无法执行.对?
目前尚不清楚"无效"是什么意思.
某些驱动程序(如DBD :: Oracle)可能会在您调用时将SQL语句发送到服务器prepare,在这种情况下,服务器prepare将检测到错误并将失败,返回undef.(另见@ Borodin关于RaiseError的说明.)
如果驱动程序在调用时未将语句发送到服务器,prepare则驱动程序将创建并返回一个语句句柄,该语句句柄中存储有语句字符串.
现在,如果发生故障,$ sth会发生什么?我无法打电话给它,因为它无效.
同样,不清楚"无效"是什么意思.(我发现尝试对我正在考虑的概念和情况非常清楚是有帮助的.强迫自己这样做通常意味着我找到了自己问题的答案,因为'问题'出现在我正在使用的词中. )
所以,正如我上面所描述的那样,要么prepare失败又要返回一个undef(或由于RaiseError引起异常 - 建议),或者prepare返回一个有效的$ sth.
如果prepare返回undef,则当您尝试调用execute时,perl将抛出异常.
如果prepare返回一个有效的$ sth然后execute将被调用,该语句将被发送到服务器,服务器将检测错误,execute并将返回false(如果设置了RaiseError则抛出异常 - 建议).
在任何时候我都不会称$ sth为"无效".要么你没有$ sth,因为准备失败,或者你有一个完全有效的$ sth,但在执行时遇到错误.
在那种情况下,调用$sth->finish会起作用,但是,正如@ThisSuitIsBlackNot正确指出的那样,这将是毫无意义的.(我应该改名finish到discard_pending_rows很多年前很多.)
| 归档时间: |
|
| 查看次数: |
1227 次 |
| 最近记录: |