迭代结果集

时间:2015-08-04 17:21:52

标签: php ibm-midrange db2-400 iseries-navigator

我在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 个答案:

答案 0 :(得分:2)

数据是否有错误?一种可能是十进制数据错误。

答案 1 :(得分:1)

@Buck Calabro让我走上正轨。问题不是十进制数据错误,而是视图定义中返回超过1行的子查询。所以这是一个选择多行的结果"错误。

如果我在iNavigator或PHP中做了一个简单的SELECT * FROM VIEW1,那么一切似乎都很好。直到我在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子句,以确保返回的第一行(也是唯一的)行是您想要的。

相关问题