为标量分配SQL查询的结果

时间:2012-11-27 22:17:45

标签: perl postgresql dbi

在我看来,只需要有一个更好的方法来做到这一点,但我仍然没有找到一个。而且我确定我不是唯一可以使用某种方法执行此操作的人:运行只在一行中生成一个字段的SQL查询,然后将该字段分配给标量。 (在我的例子中,如果查询导致多个字段/行,那么我需要担心的事情比脚本破坏要大。)

例如,要从SQL服务器获取时间戳,可以使用:

my $timestamp;
my $cmd = $dbh->prepare('SELECT cast(now() AS timestamp);') or die $!;
$cmd->execute();
while (my @asd = $cmd->fetchrow_array) {  $timestamp = $asd[0] }

很脏,但是有效。但是使用4行对于简单的赋值似乎有点多,特别是考虑到perl和postgresql可以通过DBI相互通信的程度。当然,我可以为它编写一个子程序,但是不存在一些本机允许我像使用$dbh->do()提交数据一样轻松获取数据吗?

是的,我确实尝试过谷歌。

4 个答案:

答案 0 :(得分:2)

通常我会写:

$value = $dbh->selectall_arrayref($sql)->[0]->[0];

答案 1 :(得分:1)

始终有selectrow_array

  

selectrow_array

@row_ary = $dbh->selectrow_array($statement);
@row_ary = $dbh->selectrow_array($statement, \%attr);
@row_ary = $dbh->selectrow_array($statement, \%attr, @bind_values);
     

此实用程序方法将prepareexecutefetchrow_array合并为一个调用。

这样的事情:

my $timestamp = $dbh->selectrow_array('select cast(now() as timestamp)');

对于类似的情况,还有selectrow_arrayrefselectrow_hashref

答案 2 :(得分:1)

来自perldoc DBI

   "selectrow_arrayref"

     $ary_ref = $dbh->selectrow_arrayref($statement);
     $ary_ref = $dbh->selectrow_arrayref($statement, \%attr);
     $ary_ref = $dbh->selectrow_arrayref($statement, \%attr, @bind_values);

   This utility method combines "prepare", "execute" and
   "fetchrow_arrayref" into a single call. It returns the first row of
   data from the statement.  The $statement parameter can be a previously
   prepared statement handle, in which case the "prepare" is skipped.

   If any method fails, and "RaiseError" is not set, "selectrow_array"
   will return undef.

这将帮助你完成大部分工作。你仍然需要做一些错误检查,但无论如何你都会这样做。

答案 3 :(得分:0)

fetchrow_array实际上只会返回一个标量,因为你只需要一列吗?