2

この方法でデータをフェッチすると、列名と列タイプにアクセスできますか、prepareそれともこれに到達するために明示的に必要ですか?

use DBI;

my $dbh = DBI->connect( ... ); 
my $select = "...";
my @arguments = ( ... );

my $ref = $dbh->selectall_arrayref( $select, {}, @arguments, );

アップデート:

私はこのprepareようにします:

my $sth = $dbh->prepare( $select );
$sth->execute( @arguments );
my $col_names = $sth->{NAME};
my $col_types = $sth->{TYPE};
my $ref = $sth->fetchall_arrayref;
unshift @$ref, $col_names;
4

2 に答える 2

3

最良の解決策はprepare、質問の2番目の部分で説明するように、ステートメントハンドルを取得するために使用することです。selectall_hashrefまたはを使用する場合selectall_arrayref、ステートメントハンドルを取得せず、$dbh->column_infodocs)を介して列タイプ情報を自分でクエリする必要があります。

my $sth = $dbh->column_info('','',$table,$column);  # or $column='' for all
my $info = $sth->fetchall_arrayref({});
use Data::Dumper; print Dumper($info);

(具体的には、COLUMN_NAME属性とTYPE_NAME属性)。

ただし、テーブルが2つのクエリ間でスキーマを変更すると、競合状態が発生します。

于 2012-10-13T12:56:35.400 に答える
3

また、パラメータとともに使用selectall_arrayrefして、Sliceすべての列をハッシュrefにフェッチすることもできます。プリペアドステートメントは不要で、結果セットの行の配列refを返します。各行の列はハッシュのキーであり、値は列です。値。すなわち:

my $result = $dbh->selectall_arrayref( qq{
SELECT * FROM table WHERE condition = value
}, { Slice => {} }) or die "Error: ".$dbh->errstr;

$result = [
[0] = { column1 => 'column1Value', column2 => 'column2Value', etc...},
[1] = { column1 => 'column1Value', column2 => 'column2Value', etc...},
];

結果を簡単に繰り返すことができます。つまり、次のようになります。

for my $row ( @$results ){
   print "$row->{column1Value}, $row->{column2Value}\n";
}

抽出する列を指定することもできますが、SQLクエリ構文で行う方が効率的であるため、あまり役に立ちません。

{ Slice => { column1Name => 1, column2Name => 1 } }

これは、SQLで言うのと同じように、column1Nameとcolumn2Nameの値のみを返します。

SELECT column1Name, column2Name FROM table...
于 2016-11-21T23:13:29.550 に答える