Невозможно получить следующий набор результатов при вызове хранимой процедуры db2 с использованием php из контейнера Debian на сервер IBMi

Я пытаюсь вызвать хранимую процедуру db2 с помощью php (расширение ibm_db2 v2.0.2) из ​​моего контейнера Debian на сервер IBMi.

Я установил расширение php ibm_db2 (v2.0.2) в контейнере Debian (докер) для запроса к базе данных db2, которая размещена на сервере IBMi через протокол TCP/IP, и она работает нормально, и я могу правильно делать запросы.

Моя проблема возникает, когда я пытаюсь вызвать хранимую процедуру с несколькими наборами результатов. Когда я вызываю хранимую процедуру, я могу получить первый набор результатов с помощью функции db2_fetch_assoc, но я не могу получить следующие наборы результатов с помощью функции db2_next_result. Ошибка не возникает, db2_fetch_assoc просто возвращает false для следующих наборов результатов, как если бы последующих наборов не было.

Приложение, вызывающее эту хранимую процедуру, развернуто на ZendServer на IBMi, и все работает отлично. Проблема возникает в моем "докерном" окружении. Я пробовал много вещей, например, изменить версию расширения ibm_db2, попробовать другую версию драйвера ODBC, изменить конфигурацию php, но я не могу заставить его работать.

Странно то, что когда я запускаю хранимую процедуру с db2 cli из своего докера, я могу правильно получить все свои наборы результатов. Это просто не работает с php.

Пойдем за помощью. Кто-то сталкивался с такой же проблемой?

Большое спасибо,

РЕДАКТИРОВАТЬ 18.03.2020

Информация о драйверах из функции php db2_client_info

Это мой код для получения моих наборов результатов:

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);
}

РЕДАКТИРОВАТЬ 18.03.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();
}

1 ответ

Согласно ветке комментариев, симптом был вызван неправильным кодированием.

Для db2_fetch_* звонки на работу, предыдущие db2_next_result должен возвращать набор результатов, и вы должны проверить это.

В исходном коде вы безоговорочно вызывали db2_fetch_assoc с недопустимым аргументом, поскольку db2_next_result не вернул набор результатов.

Согласно коду как в примере IBM, так и в документации PHP, необходимо протестировать результатdb2_next_result перед вызовом любого действия выборки.

CLI след показал ошибку последовательности функции, которая говорит вам, что функция вызывается в неподходящих условиях.

Другие вопросы по тегам