perl dbi prepare with variable table column name

perl dbi prepare with variable table column name

在使用 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 语句中使用问号代替列名吗?我想不,因为当我尝试以下操作时,我在执行语句所在的行出现运行时错误。

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');

您不能像您尝试的那样在 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');