使用php从Debian容器调用db2存储过程到IBMi服务器时,无法获取下一个结果集

使用php从Debian容器调用db2存储过程到IBMi服务器时,无法获取下一个结果集,php,stored-procedures,db2,ibm,Php,Stored Procedures,Db2,Ibm,我试图使用php(ibm_db2 v2.0.2扩展)从Debian容器调用一个db2存储过程到IBMi服务器 我已经在Debian容器(docker)上安装了ibm_db2(v2.0.2)php扩展,以请求通过TCP/IP协议托管在IBMi服务器上的db2数据库,它工作正常,我可以正确地进行查询 当我试图调用具有多个结果集的存储过程时,会出现问题。 调用存储过程时,我可以使用db2_fetch_assoc函数获取第一个结果集,但无法使用db2_next_result函数获取下一个结果集。没有抛出

我试图使用php(ibm_db2 v2.0.2扩展)从Debian容器调用一个db2存储过程到IBMi服务器

我已经在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使用DB2CLI运行存储过程时,我能够正确地获得所有结果集。它只是不适用于php

来寻求帮助。有人遇到过同样的问题吗

非常感谢

编辑日期:2020年3月18日

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

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);
}
编辑2020年3月18日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();
}

根据评论线程,该症状是由编码错误引起的

对于要工作的
db2\u fetch.*
调用,前面的
db2\u next\u result
必须返回一个结果集,您必须进行测试

在原始代码中,您使用无效参数无条件调用了
db2\u fetch\u assoc
,因为
db2\u next\u result
没有返回结果集

根据和中的代码,在调用上的任何获取操作之前,有必要测试
db2_next_result
的结果


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

Hello@mao,感谢您的快速回复。我添加了您要求的元素。我还不知道如何从CLI获取db2驱动程序信息,所以我同时添加了db2_client_info php函数返回的信息。@mao,我根据请求更新了代码,并提供了php版本(7.1)。如果查看
db2\u next\u result
函数的文件
ibm\u db2.c
源代码,您应该能够将其操作与CLI跟踪相匹配。确保为容器分配了足够的内存来存储结果集。@mao,$nextResults是一个资源,不会引发异常。但是$row=db2\u fetch\u assoc($nextResults),$row是一个布尔值,为false。如何激活跟踪?你有我可以运行的跟踪命令的例子吗。我应该在我的客户机或服务器上运行吗?我会检查这一点并向您通报。谢谢!