如何使用 Perl DBI 检索 DB2 SQL 存储过程的返回值?

Posted

技术标签:

【中文标题】如何使用 Perl DBI 检索 DB2 SQL 存储过程的返回值?【英文标题】:How do you retrieve the return value of a DB2 SQL sproc using Perl DBI? 【发布时间】:2011-12-20 13:07:14 【问题描述】:

我需要检索由我编写的 DB2 存储过程返回的值。 sproc 返回表中的行数,并由调用进程用于决定是否更新其他数据。

我看过几个关于 SO 的类似问题,但它们指的是使用 out 参数而不是使用 sproc 的返回值,例如:

Perl Dbi and stored procedures

我使用标准 DBI 连接到启用了 RaiseError 和 PrintError 的数据库。

$sql_stmt = "调用 MY_TABLE_SPACE.MY_SPROC('2011-10-31')"; $sth = $dbh->prepare($sql_stmt) 或死“无法准备 SQL '$sql_stmt': $rps_met_dbh->errstr”; $rsp = 0; $rsp = $sth->execute(); 除非($rsp) print(STDERR "无法执行存储过程:$rps_met_dbh->errstr\n"); 打印(标准错误“$?\n”);

我尝试查看语句句柄和数据库句柄的 $h->err。

如果可以的话,我真的更喜欢通过返回码而不是使用 SQLSTATE 机制来传达行数。

编辑:

我已经完成了使用专用输出参数来传达更新的行数,如下所示:

$sql_stmt = "调用 MY_TABLE_SPACE.MY_SPROC('2011-10-31')"; $sth = $dbh->prepare($sql_stmt) 或死“无法准备 SQL '$sql_stmt': $rps_met_dbh->errstr”; $sth = $dbh->bind_param_inout(1, $rows_updated, 128) 或死“无法准备 SQL '$sql_stmt': $rps_met_dbh->errstr”; $rows_updated = 0; $rsp = 0; $rsp = $sth->execute(); 除非($rsp) print(STDERR "无法执行存储过程:$rps_met_dbh->errstr\n"); 打印(STDERR“$rows_updated\n”);

编辑 2:

现在进一步思考这一点,我意识到我应该应用“告诉。不要问”的 PragProg 原则。也就是说,我不应该调用 sproc。然后让它在我决定是否调用另一个 sproc 之前给我一个号码,即“询问”。

我应该调用第一个存储过程。并让它决定是否应该调用另一个存储过程,即“告诉”并让它决定。

【问题讨论】:

【参考方案1】:

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

我不知道“使用 SQLSTATE”是什么意思。我也不知道您查看 $h->err 是什么意思,因为它仅在过程失败或您无法调用过程(SQL 错误等)时设置。

【讨论】:

感谢您的帮助。我将使用您的建议在 SQL 中使用赋值“?=调用 MY_TABLE_SPACE.MY_SPROC”以及 bind_param_inout。 “使用 SQLSTATE”意味着在存储过程中设置一个显式的 SQLSTATE 值,当然在用户定义的数字范围内,然后使用 $sth->state 来检索五个字符的代码。 这不适用于 DB2。所以我现在使用的是 out 参数而不是返回值。 正如我所说,我不确定 DB2 过程是否被允许返回任何东西——这通常使它们成为函数而不是过程。

以上是关于如何使用 Perl DBI 检索 DB2 SQL 存储过程的返回值?的主要内容,如果未能解决你的问题,请参考以下文章

Perl DBI - 使用多个语句运行 SQL 脚本

Perl DBI / FreeTDS / SQL-Server:如何插入/更新 BLOB varbinary(max) 数据?

Perl DBI / MS ODBC Driver (LinuxL:RHEL) / SQL-Server:如何插入/更新 BLOB varbinary(max) 数据?

Perl DBI - 加载到 SQL Server

使用 perl DBI 的 SQL 服务器事务问题

如何删除从perl读取sql文件时附加的特殊字符