如何从 SQL 查询中获取多列并将它们存储在 perl 中的二维数组中

BugShotGG

假设我有一个类似的查询:

my $sql = "SELECT dev_name,
                  OID_name,
                  Obj_Val
           FROM dev_logs";

表的值如下

+----+------------+----------------------+---------+---------------------+
| id | dev_name   | OID_name             | Obj_Val | timeStamp           |
+----+------------+----------------------+---------+---------------------+
|  1 | iKazatseva | ubntWlStatRssi       | 29      | 2017-07-22 15:18:34 |
|  2 | iKazatseva | ubntWlStatSignal     | -67     | 2017-07-22 10:12:32 |
|  3 | iKazatseva | ubntWlStatCcq        | 91      | 2017-07-22 15:18:34 |
|  4 | iKazatseva | ubntWlStatNoiseFloor | -96     | 2017-07-27 16:45:24 |
+----+------------+----------------------+---------+---------------------+

如何将查询返回的值存储在如下所示的二维数组中?

+------------+----------------------+---------+
| dev_name   | OID_name             | Obj_Val |
+------------+----------------------+---------+
| iKazatseva | ubntWlStatRssi       | 29      |
| iKazatseva | ubntWlStatSignal     | -67     |
| iKazatseva | ubntWlStatCcq        | 91      |
| iKazatseva | ubntWlStatNoiseFloor | -96     |
+------------+----------------------+---------+

我已经尝试了一些东西,但我所能得到的只是将它们绑定在一个一维数组中,例如:

my @devLogsArr = $dbh->selectall_arrayref($sql);

或者

my @OID_names= map {$_->[1]}
  @{$dbh->selectall_arrayref($sql)};

或将它们绑定在变量中,例如:

$sth->bind_col(1, \$devname);
$sth->bind_col(2, \$OID);
$sth->bind_col(3, \$value);

print "$devname\t$OID\t$value\n" while $sth->fetchrow_arrayref;

my @devLogsArr;
push(@devLogsArr, (devname=> $devname, OID=> $OID, value=> $value))
while $sth->fetchrow_arrayref;

但它远不是我想做的。我知道我可以通过查询每个单独列的数据库来完成,但这将是多余的。

我在这里问的可行吗?

提前致谢。

所述selectall_arrayref()返回一个数组引用在 DBI 中看到因此我们可以将其用作

my $all_rows = $dbh->selectall_arrayref($sql);

将它分配给一个变量,一个标量,$all_rows为了取消引用此并创建一个数组

my @all_rows = @{ $all_rows };

我使用相同的名称(“all_rows”)只是为了表明具有相同名称的标量 ( $) 和数组 ( @) 是不同的变量。不过,这不是我推荐的做法,因为可能会导致混淆;仔细选择名字。在这种情况下,{ }不需要并且@$all_rows很好。

现在您可以打印内容

foreach my $row (@all_rows) { 
    print "@$row\n";
}

$row从数组中检索到的每个本身都是一个数组引用,因此我们取消引用它 ( @$row),或

print "@$_\n" for @all_rows;

引用对于工作来说非常方便,因此可能没有太多理由使用行创建实际数组;把它放在里面$all_rows打印出来

print "@$_\n" for @$all_rows;

where@$all_rows取消引用$all_rows并创建一个for迭代列表,将每个元素放在特殊的$_ 变量中然后取消引用@$_,并"@$_"printing 中进行插值以便我们在元素之间获得空格以获得清晰的读数。

文献:教程perlreftut、食谱perldsc和参考perlref


现在,为了以某种方式添加列名,首先阐明这样做的目的很重要。如果是为了查找,那么应该通过什么来查找?如果您按列名查询,那么您希望如何访问一行的元素?通过索引,还是以某种方式再次通过名称?您是否也希望能够方便地遍历它?保持列的顺序?

在这一点上,我们实际上是在实现关系数据库风格的功能。

所以也许只是保持简单。arrayref 有信息,为了显示,您可以简单地先打印列名。格式化可以通过printf 处理,详细信息在sprintf 中可用

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章