Записи rikh:
я прилагаю все усилия, чтобы всегда назвать htmlentities () для чего-либо, что я - вывод, который получен из ввода данных пользователем.
См. эссе Joel о Взгляд Кода Создания Неправильно для справки с этим
Проверьте модуль DBI. Фактически, этому посвящен целый веб-сайт: dbi.perl.org . Также ознакомьтесь с справочником по модулю CPAN для DBI .
Вот пример кода, прямо из первого руководства по DBI в Google :
use DBI;
my $dbh = DBI->connect('DBI:Oracle:payroll')
or die "Couldn't connect to database: " . DBI->errstr;
my $sth = $dbh->prepare('SELECT * FROM people WHERE lastname = ?')
or die "Couldn't prepare statement: " . $dbh->errstr;
$sth->execute($lastname) # Execute the query
or die "Couldn't execute statement: " . $sth->errstr;
# Read the matching records and print them out
while (@data = $sth->fetchrow_array()) {
my $firstname = $data[1];
my $id = $data[2];
print "\t$id: $firstname $lastname\n";
}
if ($sth->rows == 0) {
print "No names matched `$lastname'.\n\n";
}
$sth->finish;
print "\n";
print "Enter name> ";
$dbh->disconnect;
Perl также имеет многострочность в стиле EOF комментарий; вы можете сделать такой длинный запрос:
my $query = <<'END_QUERY';
${SQLPLUS_SETTINGS}
select foo||'|'||bar ||'|'|| xyz from temp where dfg='some';
exit;
END_QUERY
Хороший совет использовать DBI, и определенно правильный способ делать что-то, если вы хотите программировать сценарии Perl для баз данных.
Однако , чтобы ответить на ваш точный вопрос, если вы хотите создать сценарий SQL * Plus, синтаксис для этого с помощью сценария Perl довольно похож на версию оболочки
my $connect_string = 'scott/tiger@test';
my $sqlplus_settings = '';
my $result = qx { sqlplus $connect_string <<EOF
$sqlplus_settings
select 1 from dual;
exit;
EOF
};
print $result;
. Оператор qx
, который я использую там, следующий: просто более вежливая форма обратной кавычки, все в блоке, разделенном фигурными скобками, выполняется подоболочкой, а вывод возвращается в назначение. В Perl переменные обычно не заключаются в верхний регистр.
Пара вещей:
DBI, безусловно, лучший вариант. Однако обратите внимание на предыдущий ответ, который я дал на вопрос Oracle, который, возможно, «все еще» актуален: Как я могу использовать сервер базы данных из сценария Perl CGI?
SQL * Plus выдает ошибку, если ваш SQL был слишком длинным . Он имеет буфер фиксированной длины строки (я не могу вспомнить, что это было, но я думаю, что с Oracle 8 он был ниже 2000 символов). Возможно, есть обходной путь (разделение строк? Настройки конфигурации?), Но я нашел переход на DBI лучшим решением по этой и другим причинам.
Предостережение: вся моя информация выше основана на Oracle 8.
/ I3az /
Любой вопрос этого типа должен начинаться со слов «Я не могу использовать DBI, потому что ...» Потому что вы действительно хотите использовать DBI, если это вообще возможно . У вас могут быть веские причины не использовать его, но, возможно, мы сможем рассказать вам, почему ваши причины не очень веские и что с этим делать. При этом, вот один из способов сделать то, что вы просили, используя вилку и дескрипторы файлов и получать вывод по одной строке за раз (предупреждение: если вы напечатаете слишком много для такого процесса, он может заблокироваться из-за проблем с буфером):
use strict;
use warnings;
pipe(my($p_rdr, $c_wtr)) or die "Err: $!";
pipe(my($c_rdr, $p_wtr)) or die "Err: $!";
my $pid = fork;
die "Could not fork: $!" unless defined $pid;
unless ($pid) {
close $p_rdr;
close $p_wtr;
open(STDOUT, ">&=", $c_wtr) or die "dup: $!";
open(STDIN, "<&=", $c_rdr) or die "dup: $!";
print "Exec sqlplus\n";
exec qw(sqlplus user/passwd@dbname);
die "Could not exec: $!";
}
close $c_wtr;
close $c_rdr;
print "Print sql\n";
print $p_wtr "select * from table_name where col1 = 'something';\n";
print "Close fh\n";
close $p_wtr;
print "Read results\n";
while (<$p_rdr>) {
print "O: $_";
}
close $p_rdr;