1

これを行うためのより良い方法がなければならないように思えますが、まだ見つけていません。そして、これを行う方法を使用できるのは私だけではないと確信しています。1行に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] }

汚れていますが、機能します。しかし、特に perl と postgresql が DBI を介して相互に通信できることを考えると、単純な割り当てには 4 行を使用するのは少し多すぎるように思えます。確かに、サブルーチンを書くことはできますが、データを送信するのと同じくらい簡単にデータを取得できるネイティブなものはありません$dbh->do()か?

はい、私はグーグルを試しました。

4

4 に答える 4

2

通常、私は次のように書きます。

$value = $dbh->selectall_arrayref($sql)->[0]->[0];
于 2012-11-27T22:57:19.843 に答える
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 に答える
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を 1 つの呼び出しに結合します。

だから、このようなもの:

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

同様の状況でともselectrow_arrayrefあります。selectrow_hashref

于 2012-11-27T22:41:46.087 に答える
0

fetchrow_array1列しか要求していないので、実際にはスカラーのみを返すのではないでしょうか?

于 2012-11-27T22:27:07.710 に答える