Perl fetchrow_array返回空数组 查询无输出问题排查
问题根因
代码对Perl DBI取数方法的返回值类型理解错误,解引用逻辑和实际返回类型不匹配,导致没有输出。fetchrow_array()每次调用会返回当前结果行所有字段组成的普通列表,你的SQL只查询了XMLRECORD一个字段,因此循环里my ($row)接收到的$row就是XML内容本身的标量值,不是数组引用。此时写@$row相当于把一个普通标量强行当作数组引用解引用,属于类型错误,没有开启strict/warnings的情况下会静默失败,不会打印任何内容。
另外原代码没有给execute()方法加错误捕获,若SQL执行阶段出错也会直接静默跳过循环,表现为无输出。
修复方案
- 补全全链路的错误捕获,给execute加异常判断
- 修正取数逻辑,去掉多余的错误解引用操作
修正后的完整代码片段:
my $sth = $dbh->prepare("select XMLRECORD from F_COMPANY") or die "预处理SQL失败: " . $dbh->errstr; $sth->execute() or die "执行SQL失败: " . $sth->errstr; # 循环读取返回数据 while( my ($xml_record) = $sth->fetchrow_array()){ print $xml_record . "\n"; }
调试技巧
如果修正后还是无输出,可以用以下方法快速定位问题:
- 脚本开头强制加严格模式和报错提示,所有隐藏错误都会直接打印:
use strict; use warnings; use diagnostics;
- 一次性拉取所有结果确认返回行数,判断是SQL没返回数据还是循环逻辑错了:
my $all_rows = $sth->fetchall_arrayref(); print "查询返回总行数: " . scalar(@$all_rows) . "\n"; # 逐行打印第一个字段(即XMLRECORD) for my $single_row (@$all_rows) { print $single_row->[0] . "\n"; }
DBI取数方法返回值对照表
避免后续再搞混返回类型:
fetchrow_array():返回字段值组成的列表,单字段赋值给标量时直接拿到字段值fetchrow_arrayref():返回当前行的数组引用,取第一个字段写法为$ref->[0]fetchrow_hashref():返回当前行的哈希引用,按字段名取值,写法为$href->{XMLRECORD}
注意:只有当变量本身是数组引用类型时,才能用
@$ref的写法解引用,普通标量做该操作会触发类型错误。
内容的提问来源于stack exchange,提问作者Eimaan
相关产品推荐
相关产品推荐

