db2_fetch_assoc() 在遍历结果集的过程中中途失败

db2_fetch_assoc() fails midway through iterating over result set

我运行正在使用 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 行的子查询。所以这是一个 "Result of select more than one row" 错误。

如果我在 iNavigator 或 PHP 中做一个简单的 SELECT * FROM VIEW1,一切似乎都很好。直到我手动 运行 STRSQL 中提到的查询或 运行 视图定义,就好像它不是 iNavigator 中视图的一部分一样,才会报告错误。

这里基本上就是为了帮助未来的用户。

TABLEA 包含一个包含 10 行的列。 我写了这样一个视图:

CREATE VIEW VIEWA (COL1, COL2, COL3)
AS SELECT 1, 2, (
    SELECT * FROM TABLEA
);

sub-select 返回 10 行,数据库引擎不知道如何处理它。相反,如果您将 FETCH FIRST 1 ROW ONLY 添加为子查询的一部分,则错误已修复。这并不是说从逻辑上讲你会得到正确的结果,因为你可能需要第二行而不是第一行。其次,还建议您指定一个 ORDER BY and/or WHERE 子句以确保返回的第一行(也是唯一一行)是您想要的。