Я работаю на 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 меняется каждый раз, когда я его запускаю. Это почти как время ожидания и заканчивается, прежде чем он может перебрать все наборы результатов, но страница загружается в считанные секунды. За исключением результатов, отсутствующих в наборе результатов, кажется, что все функционирует и прекрасно загружается на странице.
Кто-нибудь знает, что может способствовать этому поведению?
Возможно ли, что в данных есть ошибки? Одна возможность — десятичные ошибки данных.
@ Бак Калабро сделал меня на правильном пути. Проблема была не в десятичных ошибках данных, а в подзапросе в определении представления, которое возвращало более 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
предложение, чтобы гарантировать, что первая (и единственная) возвращенная строка будет тем, что вы хотите.