Хотя это и составляет сверхзадачу для простых приложений, важно знать, что метод prepare() в некоторых ситуациях может обеспечить существенный выигрыш в произ­водительности. Многие сценарии заключаются в подготовке одного единственного запроса (например, запроса INSERT) и последующем его многократном выполнении с различными значениями, что необходимо и тогда, когда один и тот же запрос выполняется без каких-либо изменений. Например, предположим, что необходимо добавить некоторые данные в базу данных. Оператор INSERT может оставаться по форме одним и тем же, и значения данных при этом изменяются. В таком случае методы prepare() и execute() можно использовать с маркерами DBI-интерфейса, как показано в следующем примере. Это позволит уменьшить нагрузку и повысить производительность приложения.
Листинг 20.14.
#!/usr/bin/perl
# загрузить модуль use DBI();
# соединить
my $dbh = DBI->connect{"DBI:mysql:database=somedb;host=localhost", "user", "pass");
# выполнить запрос
$sth = $dbh->prepare("INSERT INTO books (title, author) VALUES
(?,?)");
# прочитать данные из файла
open (FILE, "data. txt") or die (" Невозможно открыть файл"); @lines = <FILE>; close (FILE);
# просмотр исходных данных
# разбиение на составляющие части
# замена маркеров в операторе foreach $line (@lines) 
{
my ($title, $author) = split (",", $line); chomp ($title); chomp ($author);
$sth->execute{$title, $author) or die ($dbh->errstr);
}
# очистить
$sth->finish();
$dbh->disconnect();
Знаки вопроса в операторе prepare() - это и есть маркеры, и они обрабатываются аналогично переменным. Знаки вопросов проставляются в местах, где позднее будут по­мещены значения данных. Сами данные подставляются в последующем операторе exe-cute(). Обычно оператор execute() размещается в цикле, при этом новые значения пе­ременных подставляются при каждой итерации, как это сделано в предыдущем примере исходного текста (который считывает их из текстового файла). Значения переменных, за­данные в методе execute(), называются связанными значениями, а процесс установления соответствия между связанными значениями и маркерами, называется связыванием.
Дополнительные функции, имеющие отношение к выполнению запросов, перечислены в табл. 20.2.

Реальная жизнь вносит свои коррективы...
Следует сказать, что предыдущий пример более иллюстративный, чем практический. В реальной ситуации при необходимости добавления данных из файла в таблицу, быстрее и эффективнее сработает оператор LOAD DATA INFILE, имеющийся в арсенале MySQL. Но данный пример лучше показывает работу маркеров.
Однако сценарий Perl может пригодиться, когда выбираемые данные должны быть обработаны с помощью регулярных выражений перед их вставкой в базу данных (это обычно необходимо при выборке данных из устаревших баз данных/приложений). В таких ситуациях просмотр в цикле содержимого файла с использованием маркеров представляет собой очень удобный метод. Более подробная информация об операторе LOAD DATA INFILE находится в главе 8, "Обработка баз данных и таблиц".