2011-11-02 39 views
1

我需要检索我编写的DB2 sproc返回的值。 sproc返回表中的行数,被调用进程用来决定是否更新其他数据。如何使用Perl DBI检索DB2 SQL sproc的返回值?

我已经看了看SO几个类似的问题,但它们指的是使用了参数,而不是使用存储过程的返回值,例如:

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机制来传递行数,如果可以的话。

编辑:

我已经完成了使用专用的输出参数如下沟通更新行数:

 

    $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原则。也就是说,我不应该打电话给我。然后在决定是否拨打另一个存档,即“询问”之前让它回复一个数字。

我应该只打电话给第一个存档。并决定是否应该调用另一个片断,即“告诉”并让它决定。

回答

1

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

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

+0

感谢您的帮助。我将使用你的建议在SQL“?= call MY_TABLE_SPACE.MY_SPROC”中使用一个赋值以及bind_param_inout。 “使用SQLSTATE”意味着在sproc中设置一个明确的SQLSTATE值,在用户定义的数字范围内,然后使用$ sth-> state来检索五个字符代码。 –

+0

这不适用于DB2。所以我现在使用out参数而不是返回值。 –

+0

正如我所说的,我不确定DB2程序是否被允许返回任何东西 - 这通常使它们成为一个函数而不是程序。 – bohica