db2_fetch_assoc () завершается с ошибкой в ​​середине перебора набора результатов

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

Кто-нибудь знает, что может способствовать этому поведению?

2

Решение

Возможно ли, что в данных есть ошибки? Одна возможность — десятичные ошибки данных.

2

Другие решения

@ Бак Калабро сделал меня на правильном пути. Проблема была не в десятичных ошибках данных, а в подзапросе в определении представления, которое возвращало более 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 как часть подзапроса ошибка исправлена. Это не означает, что логически вы получите правильные результаты, поскольку вам может понадобиться 2-й ряд, а не первый. Во-вторых, также было бы предложено указать ORDER BY и / или WHERE предложение, чтобы гарантировать, что первая (и единственная) возвращенная строка будет тем, что вы хотите.

1

По вопросам рекламы [email protected]