![]() |
Построение на Perl web-интерфейса c базой данных Oracle
Построение на Perl web-интерфейса c базой данных Oracle В последнее время во многих организациях, использующих Oracle в качестве основной СУБД, возникает задача создания web-интерфейса для различных Интернет(Интранет) приложений. Способов организации такого интерфейса существует великое множество. Можно использовать Oracle Web Toolkit, написать его на Jave, Pythone, PHP, Delphi, C.... Cписок может продолжаться бесконечно. Автор этих строк является сторонником того, что самый быстрый (имеется ввиду, конечно по времени разработки..я не буду спорить по поводу быстродействия такого решения, конечно если аналогичное приложение переписать на mod_perle оно будет работать быстрее), способ создания такого рода приложений возможен на связке Apache+Perl. Как и при работе с большинством СУБД, будем использовать DBI: Код:
#!/usr/bin/perl -wСинтаксис для соединения с Oracle при использовании DBI ничем не отличается от того, что вы использовали раньше с другими СУБД(например MySQL): Код:
$dbh=DBI->connect($source,$user,$password,\%atribut);- $source - строка с указанием драйвера БД. В документации по DBD Oracle приводится несколько различных вариантов, у меня эта строка обычно выглядит как dbi:Oracle:hostname;sid=$SID;port=$port - $user - имя пользователя, соединяющегося с базой , - $password - пароль пользователя, соединяющегося с базой, - \%atribut - необязательная ссылка на хэш атрибутов, задающих каким образом DBI будет реагировать на ошибки. Метод connect() возвращает при вызове дескриптор базы данных, если соединение было успешно установлено, либо значение undef в случае неудачи. Пример соединения: Код:
$dbh=DBI->connect("dbi:Oracle:host=localhost;sid=ORCL;port=1521", $user,$password,{PrintError=>0,AutoCommit=>0,RaiseError=>1}) or die "Couldnot connect to Oracle:$DBI::errstr\n";Код:
ORA-12154: TNS:could not resolve service name (DBD Error: OCIServerAttach)На первом этапе производится синтаксический разбор SQL команды: Код:
$sth=$dbh->prepare("SELECT name,id1,id2 FROM table1");# Cоздан дескриптор командыВторой этап заключается в сообщении базе данных о необходимости выполнить подготовленную команду SQL. Код:
$sth->execute();# Выполнить дескриптор командыКод:
# выборка из базы каждой строки как списокКод:
# выборка сразу в массивНа последнем(четвертом) этапе извлечения осуществляется освобождение ресурсов дескриптора команды: Код:
$sth->finish();Для SQL команд(INSERT,UPDATE,DELETE), отличных от Select 3 этап пропускается а для 1 и 2 этапов существует альтернативная форма записи: Код:
$rows=$dbh->do("DELETE FROM table1 WHERE name='Игорь');Код:
$sth=$dbh->prepare("INSERT INTO table1 (name) VALUES (?)");Код:
# подготовили команду и начали ее выполнять с различными данными Теперь пробуем написать приложение: Код:
#!/usr/bin/perl -w Может оказаться, что на выходе СОВСЕМ не будет данных, но это уже не проблема Perla, DBI или Apacha. Не стоит забывать, что соответствующие права доступа для Вашего приложения (или для Вашего пользователя) должны быть выданы администратором Oracle. Это очень важный момент, я например пару раз натыкался, на такие неприятности, вроде бы простой код, а результат: одни ошибки на экране... Да,естественно по окончании приложения неплохо было бы явным образом отсоединиться от Oracla: Код:
$dbh->disconnect() or warn "Disconnection with ERRORS!", $dbh->errstr();(c)Дмитрий Бондарев |
Цитата:
З.Ы. И кстати, подобная программка на Java занимает не больше строк кода, чем код из примера. |
Конечно, perl перед java в данном примере имеет меньше плюсов. Но если его сравнивать с .NET или PHP, но тут картина совершенно противоположная! :-) Это связано с тем, что perl входит в стандартную поставку Oracle (например в 10-ке идет perl 5.8.8) При это вместе с perl идет довольно большой набор модулей, которых будет вполне достаточно для создания защищенного web-сервиса в связке perl+Oracle(например идет CGI::Session, который, если я не ошибаюсь, не входит в состав поставки ActivePerl 5.8.8. от ActiveState).
|
| Время: 18:39 |