Я работаю на IBM i (AS / 400) V7R2, PHP v5.6.5, Zend Server v8.0.2.
У меня есть запрос, который занимает менее секунды для выполнения из iNavigator. Когда я запускаю тот же запрос из PHP-скрипта, а затем прокручиваю его, используя:
$numRows = 0; while ($row = db2_fetch_assoc($stmt)) { //Do stuff $numRows++; } echo $numRows++;
$numRows
заканчивается лишь частью ожидаемого набора результатов, и я получаю эту ошибку в журналах Zend:
PHP Warning: db2_fetch_assoc(): Fetch Failure in /path/to/script.php on line XXX
Обратите внимание, что значение $ numRows меняется каждый раз, когда я его запускаю. Это почти похоже на то, что время и конец заканчиваются, прежде чем он сможет перебирать все результирующие наборы, но страница загружается за считанные секунды. Вне результатов, отсутствующих в результирующем наборе, все, кажется, функционирует и прекрасно загружается на странице.
Кто-нибудь знает, что может способствовать этому поведению?
Возможно ли, что данные имеют ошибки? Одна из возможностей – это ошибки десятичных данных.
@Buck Calabro заставил меня на правильном пути. Проблема заключалась не в ошибках десятичных данных, а скорее в подзапросе в определении представления, которое возвращало более 1 строки. Таким образом, это была ошибка «Результат выбора более чем одной строки».
Если бы я сделал простой SELECT * FROM VIEW1
в iNavigator или PHP, все, казалось, получилось отлично. Только когда я либо запустил упомянутый запрос в STRSQL
либо запустил определение представления вручную, как если бы он не был частью представления в iNavigator, о котором сообщалось бы об ошибке.
Чтобы помочь будущим пользователям, в основном, это то, что происходит.
TABLEA
содержит один столбец с 10 строками. Я пишу такое мнение:
CREATE VIEW VIEWA (COL1, COL2, COL3) AS SELECT 1, 2, ( SELECT * FROM TABLEA );
Суб-выбор возвращает 10 строк, а механизм БД не знает, как его обрабатывать. Если вместо этого вы добавите FETCH FIRST 1 ROW ONLY
как часть подзапроса, ошибка будет исправлена. Это не значит, что логически вы получите правильные результаты, так как вам может понадобиться вторая строка, а не первая. Во-вторых, было бы также предложено указать предложение ORDER BY
и / или WHERE
, чтобы гарантировать, что первая (и только) строка, возвращаемая, будет тем, что вы хотите.