2

我在 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 的值都会有所不同。几乎就像它在遍历所有结果集之前超时并结束一样,但页面会在几秒钟内加载。除了结果集中缺少的结果之外,一切似乎都可以正常运行并在页面上加载得非常好。

有谁知道可能导致这种行为的原因是什么?

4

2 回答 2

2

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

于 2015-08-04T19:58:32.777 回答
1

@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 BYand/orWHERE子句以确保返回的第一(也是唯一)行是您想要的。

于 2015-08-05T13:40:05.393 回答