0

Perl のDBIモジュールを使用してデータベースに値を挿入する必要があります。ファイルを解析してこれらの値を取得したため、これらの値は配列に存在@array1@array2ます@array3。一度に 1 つの値を挿入する方法は知っていますが、配列からではありません。

一度に1つの値を挿入することを知っています:

$dbh = DBI->connect("dbi:Sybase:server=$Srv;database=$Db", "$user", "$passwd") or die "could not connect to database";
$query= "INSERT INTO table1 (id, name, address) VALUES (DEFAULT, tom, Park_Road)"; 
$sth = $dbh->prepare($query) or die "could not prepare statement\n";
$sth-> execute or die "could not execute statement\n $command\n";

ID を含む array1、名前を含む array2、およびアドレスを含む array3 があるかどうかはわかりません。値を挿入するにはどうすればよいでしょうか。

4

4 に答える 4

5

並列配列があるため、 execute_arrayを利用できます。

my $sth = $dbh->prepare('INSERT INTO table1 (id, name, address) VALUES (?, ?, ?)');
my $num_tuples_executed = $sth->execute_array(
    { ArrayTupleStatus => \my @tuple_status },
    \@ids,
    \@names,
    \@addresses,
);

これは、ドキュメントから切り捨てられた (そしてわずかに変更された) 例であることに注意してください。この機能を使用することにした場合は、残りの部分を確認することをお勧めします。

于 2009-11-18T21:46:02.220 に答える
2

プレースホルダーを使用します。

更新:並列配列があることに気付きました。これは、一緒に使用するデータ項目を操作するための良い方法ではありません。その警告で、 List::MoreUtils::each_arrayを使用できます:

#!/usr/bin/perl

use strict; use warnings;

use DBI;
use List::MoreUtils qw( each_array );

my $dbh = DBI->connect(
    "dbi:Sybase:server=$Srv;database=$Db", 
    $user, $passwd, 
) or die sprintf 'Could not connect to database: %s', DBI->errstr;

my $sth = $dbh->prepare(
    'INSERT INTO table1 (id, name, address) VALUES (?, ?, ?)'
) or die sprintf 'Could not prepare statement: %s', $dbh->errstr;

my @ids = qw( a b c);
my @names = qw( d e f );
my @addresses = qw( g h i);

my $it = each_array(@ids, @names, @address);
while ( my @data = $it->() ) {
    $sth->execute( @data )
        or die sprintf 'Could not execute statement: %s', $sth->errstr;
}

$dbh->commit
    or die sprintf 'Could not commit updates: %s', $dbh->errstr;

$dbh->disconnect;

コードはテストされていないことに注意してください。

FAQ:常に "$vars" を引用するのは何が問題なの? .

さらに、エラーを処理する唯一の方法が死ぬことであることを考えると{ RaiseError => 1 }connect呼び出しで指定することを検討することをお勧めします。

于 2009-11-18T20:11:43.897 に答える
0

もう 1 つの方法は、ハッシュを中間ストレージ領域として使用することです。いいえ:

my $hash = {};
foreach(@array1) {
  $hash->{id} = $array1[$_];
  $hash->{name} = $array2[$_];
  $hash->{address} = $array3[$_];
}
foreach( keys %$hash ) {
  $sql = "insert into table values(?,?,?)";
  $sth = $dbh->prepare($sql) or die;
  $sth->execute($hash->{id}, $hash->{name}, $hash->{address}) or die;
}

ただし、これは同期されている 3 つのアレイに依存します。ただし、これを変更して、array1 を介した最初のループ内の他の配列で値の変更またはチェックまたは grep を行うことができます (つまり、array2 および array3 の値が「NN-name」および「NN-address」として格納される場合、NN はは最初の配列の ID であり、対応する値を見つけて NN- with as// regex を削除する必要があります)。ただし、データの構造によって異なります。

もう 1 つの注意点は、Class::DBI を調べて、データを取得するためのより優れた、よりオブジェクト指向の方法を提供するかどうかを確認することです。

于 2009-11-18T20:12:45.250 に答える
0

配列に何が含まれているのか、どうしてわからないのでしょうか? とにかく、アプローチは1つの配列を反復処理し、他の配列に対応する値があると仮定して、それらを挿入ステートメントに入れます

于 2009-11-18T20:01:34.237 に答える