SQL*Plus в сценарии Perl

Записи rikh:

я прилагаю все усилия, чтобы всегда назвать htmlentities () для чего-либо, что я - вывод, который получен из ввода данных пользователем.

См. эссе Joel о Взгляд Кода Создания Неправильно для справки с этим

5
задан tjwrona1992 30 September 2015 в 16:57
поделиться

4 ответа

Проверьте модуль 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
10
ответ дан 18 December 2019 в 10:46
поделиться

Хороший совет использовать 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 переменные обычно не заключаются в верхний регистр.

4
ответ дан 18 December 2019 в 10:46
поделиться

Пара вещей:

  • DBI, безусловно, лучший вариант. Однако обратите внимание на предыдущий ответ, который я дал на вопрос Oracle, который, возможно, «все еще» актуален: Как я могу использовать сервер базы данных из сценария Perl CGI?

  • SQL * Plus выдает ошибку, если ваш SQL был слишком длинным . Он имеет буфер фиксированной длины строки (я не могу вспомнить, что это было, но я думаю, что с Oracle 8 он был ниже 2000 символов). Возможно, есть обходной путь (разделение строк? Настройки конфигурации?), Но я нашел переход на DBI лучшим решением по этой и другим причинам.

Предостережение: вся моя информация выше основана на Oracle 8.

/ I3az /

1
ответ дан 18 December 2019 в 10:46
поделиться

Любой вопрос этого типа должен начинаться со слов «Я не могу использовать 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;
1
ответ дан 18 December 2019 в 10:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: