首页 文章

如何使用Perl DBI检索DB2 SQL sproc的返回值?

提问于
浏览
1

我需要检索我编写的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 回答

  • 1

    在过程中使用输出参数有什么问题 . 我现在没有工作的DB2,或者我提供了一个例子,但是当我使用它时,我确信你可以在程序中定义输出参数并用bind_param_inout绑定它们 . 我不记得DB2过程是否可以返回一个值(如函数)但如果它们可以使用“?= call MY_TABLE_SPACE.MY_SPROC('2011-10-31')”将允许您绑定输出返回值 . 如果这不起作用,您可以使用肯定可以返回值的DB2函数 . 但是,在一天结束时,从过程/函数中获取数据的方式是绑定输出参数 - 这就是它的方式 .

    我不知道“使用SQLSTATE”是什么意思 . 我也不知道你看$ h-> err是什么意思,因为只有在程序失败或者你不能调用程序时才会设置(SQL错误等) .

相关问题