You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Perl fetchrow_array返回空数组 查询无输出问题排查

问题根因

代码对Perl DBI取数方法的返回值类型理解错误,解引用逻辑和实际返回类型不匹配,导致没有输出。
fetchrow_array()每次调用会返回当前结果行所有字段组成的普通列表,你的SQL只查询了XMLRECORD一个字段,因此循环里my ($row)接收到的$row就是XML内容本身的标量值,不是数组引用。此时写@$row相当于把一个普通标量强行当作数组引用解引用,属于类型错误,没有开启strict/warnings的情况下会静默失败,不会打印任何内容。
另外原代码没有给execute()方法加错误捕获,若SQL执行阶段出错也会直接静默跳过循环,表现为无输出。

修复方案
  1. 补全全链路的错误捕获,给execute加异常判断
  2. 修正取数逻辑,去掉多余的错误解引用操作

修正后的完整代码片段:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 15:51:25