Perl DBI - DB2:fetchrow失败0记录

时间:2013-04-02 06:07:56

标签: perl select db2 dbi

我正在将AIX脚本迁移到Linux。 在特定的脚本中

$sql_stmt6 = "SELECT CHAR(DATE(MAX(TIMESTAMP)),USA) FROM SCHEMA.TABLENAME WHERE COL1 = 194 and COL2 ='P'";
$sth6= $dbh1->prepare($sql_stmt6);
$sth6->execute();
while (@rows = $sth6->fetchrow)
{
    $var = $rows[0];
    $var =~ s/\s+$//;
    print "var = $var\n";
}
$sth6->finish();

当select返回一行时,fetchrow工作正常,但如果select给出了0条记录, fetchrow抛出了以下错误:

错误:第0列中的数据已被截断为10个字节。 ./test.pl第46行最多可获得-1个字节

请帮忙......谢谢......

2 个答案:

答案 0 :(得分:0)

执行此操作的标准方法是使用fetchrow_arrayas shown in the DBI documentation。文档清楚地解释了没有返回行时应该采取的行为。

我不确定fetchrow是什么。我确实看到它在DBD::DB2文档中的示例中使用(我认为这就是你使用它的原因),但我无法在任何地方看到它。我猜这是过时的或内部函数绕过正确的错误处理。请尝试切换到fetchrow_array

其他重要注意事项:

确保在准备和执行语句时检查错误:

$sth6 = $dbh1->prepare($sql_stmt6) or die 'Cannot prepare: ' . $dbh1->errstr;
$sth6->execute() or die 'Cannot execute: ' . $sth6->errstr;

确保

use strict;
use warnings;

如果您还没有这样做(看起来很可疑,因为我没有看到使用my声明任何变量)。

这两个步骤都可以更容易地发现错误。

它还可以帮助您为变量使用更多描述性名称。名称$sth6表示您的代码中至少有六个不同的语句具有相似的名称。如果你将它命名为有意义的东西,例如$max_time_sth

,那将会更加清晰

答案 1 :(得分:0)

连接到AIX或Zos数据库时遇到了同样的问题,你需要试验连接属性,对我来说,转换为utf8的一些外来字符会使列的大小超过允许的长度大小,然后fetchrow_array和fetchrow_hash方法抛出错误,以下设置修复它:

LongTruncOk         => 1,
LongReadLen         => 2147483647,

您可能还需要查看DBD :: DB2特定的连接属性:

https://metacpan.org/pod/distribution/DBD-DB2/DB2.pod#Connection-Attributes