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

时间:2011-11-02 17:29:13

标签: sql perl stored-procedures dbi

我需要检索我编写的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”并让它决定。

1 个答案:

答案 0 :(得分:1)

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

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