我需要将哈希值插入数据库。以下是我必须在table1列 key 和 value 中插入值的代码模板:
use DBI;
use strict;
%hash; #assuming it already contains desired values
my $dbh = DBI->connect(
"dbi:Sybase:server=$Srv;database=$Db",
"$user", "$passwd"
) or die sprintf 'could not connect to database %s', DBI->errstr;
my $query= "Insert INTO table1(key, values) VALUES (?,?) ";
my $sth = $dbh->prepare($query)
or die "could not prepare statement\n", $dbh->errstr;
$sth-> execute or die "could not execute", $sth->errstr;
我知道如何使用数组插入值,即使用execute_array()
,但不知道如何在table1中插入%hash
中的值。
有什么建议吗?
答案 0 :(得分:6)
以下使用您问题中提到的execute_array
函数。我测试了它。
my $dbh = DBI->connect("DBI:mysql:database=$DB;host=$host;port=$port", $user, $password);
my %hash = (
1 => 'A',
2 => 'B',
0 => 'C',
);
my @keys = keys %hash;
my @values = values %hash;
my $sth = $dbh->prepare("INSERT INTO table1(id, value) VALUES (?,?);");
$sth->execute_array({},\@keys, \@values);
(抱歉,我没有可以使用的Sybase数据库,或者我将其用作示例。)
答案 1 :(得分:2)
use DBI;
use SQL::Abstract;
use strict;
%hash; #assuming it already contains desired values
my $dbh = DBI->connect(
"dbi:Sybase:server=$Srv;database=$Db",
"$user", "$passwd"
) or die sprintf 'could not connect to database %s', DBI->errstr;
my ($query, @bind) = $sql->insert("tableName", \%hash);
my $sth = $dbh->prepare($query)
or die "could not prepare statement\n", $dbh->errstr;
$sth-> execute (@bind) or die "could not execute", $sth->errstr;
答案 2 :(得分:1)
这是构建查询的一种非常简单的方法。我通常会这样做,因为我还没有找到另一种解决方法。
use strict;
use DBI;
my $dbh = Custom::Module::Make::DBH->connect('$db');
my %hash = (
apple => 'red',
grape => 'purple',
banana => 'yellow',
);
my $keystr = (join ",\n ", (keys %hash));
my $valstr = join ', ', (split(/ /, "? " x (scalar(values %hash))));
my @values = values %hash;
my $query = qq`
INSERT INTO table1 (
$keystr
)
VALUES (
$valstr
)
`;
my $sth = $dbh->prepare($query)
or die "Can't prepare insert: ".$dbh->errstr()."\n";
$sth->execute(@values)
or die "Can't execute insert: ".$dbh->errstr()."\n";
但我可能也没有正确理解这个问题:P
答案 3 :(得分:0)
也许你可以尝试使用
for my $key (keys %hash) {
$sth->execute($key, $hash{$key}) or die $sth->errstr;
}
这是你想要实现的目标吗?
如果我正确理解manual(“通过引用传递给每个参数元组(值组)[...]执行准备好的语句一次......”)也应该可以简单地理解到
($tuples, $rows) = $sth->execute_array(\%hash) or die $sth->errstr;