在我看来,只需要有一个更好的方法来做到这一点,但我仍然没有找到一个。而且我确定我不是唯一可以使用某种方法执行此操作的人:运行只在一行中生成一个字段的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()
提交数据一样轻松获取数据吗?
是的,我确实尝试过谷歌。
答案 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);
此实用程序方法将
prepare
,execute
和fetchrow_array
合并为一个调用。
这样的事情:
my $timestamp = $dbh->selectrow_array('select cast(now() as timestamp)');
对于类似的情况,还有selectrow_arrayref
和selectrow_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
实际上只会返回一个标量,因为你只需要一列吗?