首页 > 解决方案 > 使用 php 从 Debian 容器到 IBMi 服务器调用 db2 存储过程时无法获取下一个结果集

问题描述

我正在尝试使用 php(ibm_db2 v2.0.2 扩展)从我的 Debian 容器到 IBMi 服务器调用 db2 存储过程。

我已经在 Debian 容器 (docker) 上安装了 ibm_db2 (v2.0.2) php 扩展来请求通过 TCP/IP 协议托管在 IBMi 服务器上的 db2 数据库,它工作得很好,我可以正确地进行查询。

当我尝试调用具有多个结果集的存储过程时,我的问题就出现了。当我调用存储过程时,我可以使用 db2_fetch_assoc 函数获取第一个结果集,但无法使用 db2_next_result 函数获取下一个结果集。没有抛出错误,db2_fetch_assoc 只是为下一个结果集返回 false,就好像没有后续集一样。

调用这些存储过程的应用程序部署在 IBMi 上的 ZendServer 上,一切正常。问题出现在我的“docker”环境中。我尝试了很多事情,比如更改 ibm_db2 扩展的版本、尝试另一个 ODBC 驱动程序版本、更改 php 配置,但我无法让它工作。

奇怪的是,当我从 docker 使用 db2 cli 运行存储过程时,我能够正确获取所有结果集。它只是不适用于php。

过来帮忙。有人遇到同样的问题吗?

非常感谢,

编辑 03/18/2020

来自 db2_client_info php 函数的驱动程序信息

这是我检索结果集的代码:

while ($row = db2_fetch_assoc($statement)) {
  print_r($row);
}

while ($row = db2_fetch_assoc(db2_next_result($statement))) {
 print_r($row);
}

while ($row = db2_fetch_assoc(db2_next_result($statement))) {
 print_r($row);
}

编辑 03/18/2020 10:50

php版本是7.1

现在的代码如下所示:

try {
   db2_execute($statement);
   while ($row = db2_fetch_assoc($statement)) {
     print_r($row);
   }

   $nextResults = db2_next_result($statement);
   while ($row = db2_fetch_assoc($nextResults)) {
    print_r($row);
   }

   $nextResults = db2_next_result($statement);
   while ($row = db2_fetch_assoc($nextResults)) {
    print_r($row);
   }      
} catch (\Exception $e) {
   echo $e->getMessage();
}

标签: phpstored-proceduresdb2ibm

解决方案


根据评论线程,该症状是由不正确的编码引起的。

为了使db2_fetch_*调用起作用,前面的db2_next_result必须返回一个结果集,您必须对此进行测试。

在您的原始代码中,您无条件地db2_fetch_assoc使用无效参数调用 ,因为db2_next_result没有返回结果集。

根据IBM 示例PHP 文档中的代码,有必要db2_next_result在调用任何 fetch 操作之前测试结果。

CLI 跟踪显示了一个函数序列错误,它告诉您在错误的情况下调用了该函数。


推荐阅读