我正在将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个字节
请帮忙......谢谢......
答案 0 :(得分:0)
执行此操作的标准方法是使用fetchrow_array
,as 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