Oracle
Материал из Eludia.
| Эта заметка не претендует на энциклопедичность. Она не отличается ни широтой охвата, ни строгостью формулировок. Это просто записочка на память. |
Эта страница — шпаргалка, куда следует записывать решения всех проблем, связанных с настройкой подключения Eludia-приложений к СУБД Oracle.
Установка DBD::Oracle под RedHat 5.4 на x64 и Oracle Instant Client 11.2
Первым делом, отключить selinux. Далее, в директории, распакованной из CPAN-архива:
export ORACLE_HOME=/usr/lib/oracle/11.2/client64 export PATH=$ORACLE_HOME/bin:$PATH export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$PATH export ORACLE_USERID="user/password@host:1521/SERVICE" perl Makefile.PL -m /usr/share/oracle/11.2/client64/demo.mk -h /usr/include/oracle/11.2/client64/ make
Видимость каталогов Oracle для процесса httpd
Иногда случается такое: вроде бы DBD::Oracle установлен (тесты проходят, отдельно стоящие скрипты работают), однако в STDERR WEB-приложения пишется нечто вроде
install_driver(Oracle) failed: Can't load '...Oracle.so'
Обычно это значит, что со стороны Apache что-то недонастроено по поводу путей к клиенту Oracle.
Прежде всего, необходимо проверить переменные окружения: ORACLE_HOME обязательно должна быть установлена, а LD_LIBRARY_PATH (на некоторых платформах, возможно, SHLIB_PATH, а под Win32 — PATH) должна содержать "$ORACLE_HOME/lib".
Кроме того, сам "$ORACLE_HOME/lib" должен быть доступен на чтение для пользователя Apache (www-data, nobody или иного, в зависимости от директивы User в httpd.conf).
Кодировки и формат даты
Вообще, наша кодировка для русскоязычных приложений cp1251, а формат даты — ISO. И то и другое — для использования алфавитного порядка сортировки. В случае Oracle это соответствует NLS_LANG = "american_america.CL8MSWIN1251" и NLS_DATE_FORMAT "yyyy-mm-dd". Вопрос — как передать данные значения параметров так, чтобы Oracle-клиент, загруженный в наше WEB-приложение, воспринял их, а не умолчания.
- Сервер БД: Oracle9i Enterprise Edition Release 9.2.0.1.0 под Windows 2003 Server
- Клиентская часть: Oracle XE 10.2.0.1.0 / Linux, DBD::Oracle 1.19
- Сервер приложения: Apache/1.3.34, mod_perl/1.29
- Решение: прописать в httpd.conf на верхнем уровне
PerlSetEnv NLS_LANG "american_america.CL8MSWIN1251" PerlSetEnv NLS_DATE_FORMAT "YYYY-MM-DD" PerlSetEnv NLS_TIMESTAMP_FORMAT "YYYY-MM-DD HH24:MI:SS"
При переходе на Apache/2.2.3, mod_apreq2-20051231/2.6.0, mod_perl/2.0.2 на том же сервере донести конфигурацию до Oracle получилось только указав явно ORACLE_HOME и внеся определение ENV-переменных непосредственно в perl-секцию:
<Perl >
$ENV {ORACLE_HOME} = "..."; # см. результат команды set
$ENV {NLS_LANG} = "american_america.CL8MSWIN1251";
$ENV {NLS_DATE_FORMAT} = "YYYY-MM-DD";
$ENV {NLS_TIMESTAMP_FORMAT} = "YYYY-MM-DD HH24:MI:SS";
...
</Perl>

