【问题标题】:Perl DBI - DB2 : fetchrow failing for 0 recordsPerl DBI - DB2:0 条记录的 fetchrow 失败
【发布时间】:2013-03-23 08:14:35
【问题描述】:

我正在将 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();

The fetchrow works fine when the select returns a row, but if the select gives 0 records, fetchrow 抛出以下错误:

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

请帮忙...谢谢...

【问题讨论】:

  • 显然你必须制作一个负长度的字符串。
  • 抱歉没听懂你...你能解释一下吗?

标签: perl select db2 dbi


【解决方案1】:

执行此操作的标准方法是使用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,它将更加清晰。

【讨论】:

  • 根据源码:"fetchrow => undef,#old alias for fetchrow_array"
【解决方案2】:

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

LongTruncOk         => 1,
LongReadLen         => 2147483647,

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

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

【讨论】:

    猜你喜欢
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 2011-05-11
    相关资源
    最近更新 更多