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

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

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

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

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

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

Приходите, чтобы получить некоторую помощь. Кто-то сталкивался с той же проблемой?

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

РЕДАКТИРОВАТЬ 03/18 / 2020

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

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

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

1 Ответ

0 голосов
/ 19 марта 2020

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

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

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

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

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *) 'G, ... функция вызывается при неправильных обстоятельствах.

...