我需要检索我编写的DB2 sproc返回的值。 sproc返回表中的行数,并由调用进程用于决定是否更新其他数据。
我已经在SO上查看了几个类似的问题,但是它们引用了out参数而不是使用sproc的返回值,例如:
Perl Dbi and stored procedures
我正在使用与数据库的标准DBI连接,同时启用了RaiseError和PrintError。
$sql_stmt = "call MY_TABLE_SPACE.MY_SPROC('2011-10-31')"; $sth = $dbh->prepare($sql_stmt) or die "Unable to prepare SQL '$sql_stmt': $rps_met_dbh->errstr"; $rsp = 0; $rsp = $sth->execute(); unless($rsp) { print(STDERR "Unable to execute sproc: $rps_met_dbh->errstr\n"); } print(STDERR "$?\n");
我试过查看$ h-> err语句句柄和db句柄。
我真的更喜欢通过返回代码传递行数,而不是使用SQLSTATE机制。如果可以的话。
修改
我已经完成了使用专用的out参数来传达更新的行数,如下所示:
$sql_stmt = "call MY_TABLE_SPACE.MY_SPROC('2011-10-31')"; $sth = $dbh->prepare($sql_stmt) or die "Unable to prepare SQL '$sql_stmt': $rps_met_dbh->errstr"; $sth = $dbh->bind_param_inout(1, $rows_updated, 128) or die "Unable to prepare SQL '$sql_stmt': $rps_met_dbh->errstr"; $rows_updated = 0; $rsp = 0; $rsp = $sth->execute(); unless($rsp) { print(STDERR "Unable to execute sproc: $rps_met_dbh->errstr\n"); } print(STDERR "$rows_updated\n");
编辑2:
现在进一步思考这个问题我已经意识到应该应用PragProg原则“告诉。不要问。”也就是说,我不应该称之为sproc。然后在我决定是否打电话给anopther sproc之前让它给我一个号码,即“Ask”。
我应该叫第一个sproc。并决定是否应该调用另一个sproc,即“Tell”并让它决定。
答案 0 :(得分:1)
在过程中使用输出参数有什么问题。我现在没有工作的DB2,或者我提供了一个示例,但是当我使用它时,我确信你可以在程序中定义输出参数并用bind_param_inout绑定它们。我不记得DB2过程是否可以返回一个值(如函数)但是如果它们可以使用“?= call MY_TABLE_SPACE.MY_SPROC('2011-10-31')”将允许您绑定输出返回值。如果这不起作用,您可以使用肯定可以返回值的DB2函数。但是,在一天结束时,从过程/函数中获取数据的方式是绑定输出参数 - 这就是它的方式。
我不知道“使用SQLSTATE”是什么意思。我也不知道你看看$ h-> err是什么意思,因为只有在程序失败或者你不能调用程序时才会设置(SQL错误等)。