Нужна помощь, потому что я не могу найти решение для своих проблем с DBD :: Oracle.DBD :: Oracle, курсоры и среда в mod_perl
Таким образом, в первом, это текущая ситуация:
- Мы бежим Apache2 с mod_perl 2.0.4 в нашей компании
- веб-сервер Apache был создан с запуском скриптом, который заходящий некоторыми переменные среды (LD_LIBRARY_PATH, ORACLE_HOME, NLS_LANG)
- в httpd.conf есть также переменные среды для LD_LIBRARY_PATH и ORACLE_HOME (через SetEnv)
- Мы обычно используем модуль DBI perl с драйвером DBD :: Oracle для подключения к нашей основной базе данных
- Прежде чем мы создадим новый экземпляр DBI, мы также устанавливаем некоторые переменные enl env (% ENV). Мы устанавливаем ORACLE_HOME и NLS_LANG.
До сих пор, это работает отлично. Но теперь мы расширяем нашу систему и должны подключаться к удаленной базе данных. Опять же, мы используем DBI и DBD :: Oracle. Но сейчас есть какие-то новые условия:
- Новое соединение должно выполняться параллельно с существующим
- TNSNAMES.ORA для нового соединения находится в другом месте (не в $ ORACLE_HOME '/ сеть./администратора)
- Новые содержимое базы данных предоставляются хранимые процедуры, которые мы Fetching с DBD :: Oracle и курсоров (как описано здесь: https://metacpan.org/pod/DBD::Oracle#Binding-Cursors)
- хранимые процедуры возвращения типов объектов и коллекций, содержащих атрибуты оракула DATE
- Чтобы получить эти даты в читаемом формате, мы устанавливаем новую переменную $ ENV ENV {nls_date_format}
- Для обеспечения формата даты мы дополнительно изменить сессию
alter session set nls_date_format ...
Хорошо, это работает тоже хорошо. Но только если мы создадим новое соединение на консоли. Новое местоположение TNS находится по сценарию, соединение может быть установлено, а также получение данных из процедур курсором также работает. Все типы DATE отформатированы, как указано.
Теперь, если мы попытаемся установить это соединение в среде apache, это не сработает. Сначала имя источника данных не удалось разрешить DBI/DBD :: Oracle. Я думаю, что это из-за нашего нового файла TNSNAMES.ORA или, скорее, местоположение не найдено DBI/DBD :: Oracle в контексте Apache (опубликовано $ ENV {TNS_ADMIN}). Но я не знаю, почему ???
Вторая проблема (если я создаю грязный обходной путь для нашего первого), что формат даты, опубликованный в $ ENV {NLS_DATE_FORMAT}, работает только на первом уровне выбора курсора.
BEGIN OPEN :cursor FOR SELECT * FROM TABLE(stored_procedure) END;
В приведенном выше примере возвращаются типы коллекций объектов, которые содержат атрибуты даты. В контексте Apache формат, опубликованный NLS_DATE_FORMAT, не распознается.Если я использую простую форму примера
BEGIN OPEN :cursor FOR SELECT SYSDATE FROM TABLE(stored_procedure) END;
результат (одно поле даты) отформатирован хорошо. Поэтому я думаю, что подчиненные структуры не форматировались, потому что $ ENV {NLS_DATE_FORMAT} работает только в контексте консоли, а не в контексте Apache.
Таким образом, должна быть проблема с переменными среды perl (% ENV), работающими под Apache и mod_perl. Может быть, проблема mod_perl?
Я нахожусь на своем остроумие. Может быть, у кого-нибудь во всем мире есть решение ... и извините мой английский :-) Если вам понадобятся дополнительные объяснения, я постараюсь определить его более точно.
это помогло? – ysth