【发布时间】:2011-12-20 13:07:14
【问题描述】:
我需要检索由我编写的 DB2 存储过程返回的值。 sproc 返回表中的行数,并由调用进程用于决定是否更新其他数据。
我看过几个关于 SO 的类似问题,但它们指的是使用 out 参数而不是使用 sproc 的返回值,例如:
Perl Dbi and stored procedures
我使用标准 DBI 连接到启用了 RaiseError 和 PrintError 的数据库。
$sql_stmt = "调用 MY_TABLE_SPACE.MY_SPROC('2011-10-31')"; $sth = $dbh->prepare($sql_stmt) 或死“无法准备 SQL '$sql_stmt': $rps_met_dbh->errstr”; $rsp = 0; $rsp = $sth->execute(); 除非($rsp){ print(STDERR "无法执行存储过程:$rps_met_dbh->errstr\n"); } 打印(标准错误“$?\n”);我尝试查看语句句柄和数据库句柄的 $h->err。
如果可以的话,我真的更喜欢通过返回码而不是使用 SQLSTATE 机制来传达行数。
编辑:
我已经完成了使用专用输出参数来传达更新的行数,如下所示:
$sql_stmt = "调用 MY_TABLE_SPACE.MY_SPROC('2011-10-31')"; $sth = $dbh->prepare($sql_stmt) 或死“无法准备 SQL '$sql_stmt': $rps_met_dbh->errstr”; $sth = $dbh->bind_param_inout(1, $rows_updated, 128) 或死“无法准备 SQL '$sql_stmt': $rps_met_dbh->errstr”; $rows_updated = 0; $rsp = 0; $rsp = $sth->execute(); 除非($rsp){ print(STDERR "无法执行存储过程:$rps_met_dbh->errstr\n"); } 打印(STDERR“$rows_updated\n”);编辑 2:
现在进一步思考这一点,我意识到我应该应用“告诉。不要问”的 PragProg 原则。也就是说,我不应该调用 sproc。然后让它在我决定是否调用另一个 sproc 之前给我一个号码,即“询问”。
我应该调用第一个存储过程。并让它决定是否应该调用另一个存储过程,即“告诉”并让它决定。
【问题讨论】:
标签: sql perl stored-procedures dbi