perl dbi使用变量表列名进行准备

时间:2019-05-21 10:17:06

标签: perl dbi

在使用perl将值插入数据库表之前,我已经多次使用以下代码

my $SRV='xxx';
my $DB='dbname';        
my $db = DBI->connect("dbi:Oracle:$SRV/$DB", "user", "pword" )  or die "impossible de se connecter à $SRV / $DB";

my $insert_T1 = "INSERT INTO tablename (ColA, ColB) VALUES ( ?, ?) " ;
my $insert_T1_sth = $db->prepare($insert_T1) ;

稍后在代码中,我可以调用以下代码进行插入

$insert_T1_sth->execute('val1','val2');
$insert_T1_sth->execute('val3','val4');

因此,基本上,当我使用上面的prepare函数时,可以用问号替换要插入的条目,然后将这些问号的值放在稍后的execute语句中。

对于我的问题:我可以在问准备语句中使用问号代替列名吗?我没有考虑,因为当我尝试以下操作时,在执行语句所在的行上出现运行时错误。

my $SRV='xxx';
my $DB='dbname';        
my $db = DBI->connect("dbi:Oracle:$SRV/$DB", "user", "pword" )  or die "impossible de se connecter à $SRV / $DB";
$db->{AutoCommit} = 0 ;

my $insert_T1 = "INSERT INTO tablename (ColA, ?) VALUES ( ?, ?) " ;
my $insert_T1_sth = $db->prepare($insert_T1) ;

然后像以前一样使用

$insert_T1_sth->execute('colname1','val1','val2');
$insert_T1_sth->execute('colname2','val3','val4');

1 个答案:

答案 0 :(得分:2)

您不能像尝试那样在prepare中使用动态列名。

您的用户不应该知道您的列名,因此,由于它们不敏感(因此不需要防止SQL注入),因此实际上不必将其作为参数的一部分。不过,准备对表演仍然有用。

我建议为每个列名称做一个准备,并将它们存储在哈希中:

my @col_names = qw(colname1 colname2);
my %inserts;
for my $col (@col_names) {
    $inserts{$col} = $db->prepare("INSERT INTO tablename (ColA, $col) VALUES (?, ?)");
}
...
$inserts{colname1}->execute('val1', 'val2');