我需要检索我编写的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机制,如果可以的话 .
Edit:
我已经完成了使用专用的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");
Edit 2:
现在进一步思考这个问题我已经意识到我应该应用PragProg原则“告诉 . 不要问 . ”也就是说,我不应该称之为sproc . 然后让它给我一个号码,然后我决定是否打电话给anopther sproc,即“Ask” .
我应该叫第一个sproc . 并让它决定是否应该调用另一个sproc,即“Tell”并让它决定 .
1 回答
在过程中使用输出参数有什么问题 . 我现在没有工作的DB2,或者我提供了一个例子,但是当我使用它时,我确信你可以在程序中定义输出参数并用bind_param_inout绑定它们 . 我不记得DB2过程是否可以返回一个值(如函数)但如果它们可以使用“?= call MY_TABLE_SPACE.MY_SPROC('2011-10-31')”将允许您绑定输出返回值 . 如果这不起作用,您可以使用肯定可以返回值的DB2函数 . 但是,在一天结束时,从过程/函数中获取数据的方式是绑定输出参数 - 这就是它的方式 .
我不知道“使用SQLSTATE”是什么意思 . 我也不知道你看$ h-> err是什么意思,因为只有在程序失败或者你不能调用程序时才会设置(SQL错误等) .