Perl DBI подготовить с именем столбца переменной таблицы - PullRequest
1 голос
/ 21 мая 2019

Я использовал следующий код много раз прежде, когда вставлял значения в таблицы базы данных, используя 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');

Таким образом, в основном, когда я использую функцию подготовки, описанную выше, я могу заменить записи, которые я хочу вставить, на вопросительные знаки, а затем поместить значения этих вопросительных знаков в операторы 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 Ответ

2 голосов
/ 21 мая 2019

Нельзя использовать динамические имена столбцов с 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');
...