1

在我看来,必须有更好的方法来做到这一点,但我还没有找到。而且我敢肯定,我不是唯一一个可以使用一种方法来做到这一点的人:运行一个 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

4 回答 4

2

通常我会写:

$value = $dbh->selectall_arrayref($sql)->[0]->[0];
于 2012-11-27T22:57:19.843 回答
1

总有selectrow_array

选择行数组

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

此实用方法将prepare,execute和组合fetchrow_array成一个调用。

所以是这样的:

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

还有类似的情况selectrow_arrayrefselectrow_hashref

于 2012-11-27T22:41:46.087 回答
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.

这将使您获得最大的收益。您仍然需要进行一些错误检查,但无论如何您都会这样做。

于 2012-11-27T22:45:18.450 回答
0

实际上不会fetchrow_array只返回一个标量,因为您只要求一列?

于 2012-11-27T22:27:07.710 回答