Невозможно получить следующий набор результатов при вызове хранимой процедуры 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 след показал ошибку последовательности функции, которая говорит вам, что функция вызывается в неподходящих условиях.