2

我正在将 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 个字节

请帮忙...谢谢...

4

2 回答 2

0

执行此操作的标准方法是使用fetchrow_array如 DBI 文档中所示。该文档清楚地解释了没有返回行时的行为应该是什么。

我不确定是什么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.

于 2013-04-02T11:03:11.147 回答
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

于 2014-02-25T14:29:57.950 回答