18.09.2014


Oracle. Windows 64-bit, работа с 32-битными внешними DLL


Категории: Администрирование — Administrator

Более 10 лет назад я написал DLL на Delphi, которую потом использовал с инстансом Oracle через механизм вызова внешних процедур. Прошло время и появились 64-битные Windows и 64-битные базы Oracle, dll-ка перестала работать, печально. Переписывать ее не хотелось и потому решил скрестить ежа и ужа, т.е. 32-битную и 64-битную версии Oracle.

Итак, граничные условия:

— Windows 2008 Server 64-bit на машине с процессором AMD (на компьютере с Intel проверено тоже)
— Oracle 11G 64-bit (релиз значения не имеет, работает на всех).

Подготовка:

1. Качаем дистрибутив Oracle для 64-битного Windows.
2. Ставим софт из дистрибутива.
3. Делаем инстанс, настраиваем Listener.
4. Качаем дистрибутив Oracle Client 32-bit
5. Ставим клиента в отдельный Oracle Home.

Настройка:

1. Проверьте системную переменную PATH, чтобы в ней были прописаны пути к папкам BIN (обязательно к BIN, а не к рутовым папкам домов) в обеих Oracle Homes.
2. Для пущей надежности, в папке ..\BIN 32-битного клиента сделайте копию программы extproc.exe и назовите ее как угодно, например EXTPROC32.EXE.
3. Положите вашу DLL в папку ..\BIN 32-битного клиента. Если в базе у вас в LIBRARY прописан другой путь для DLL, то лучше его все-таки сменить на папку ..\BIN, так как могут возникнуть проблемы с доступом.
4. В 64-битном Oracle Home меняем конфигурацию LISTENER в файле listener.ora, выглядеть это будет примерно так:


SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = D:\oracle32\product\11.2.0\client_1)
      (ENV = "EXTPROC_DLLS=ANY")
      (PROGRAM = extproc32)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = IPCKey))
      (ADDRESS = (PROTOCOL = TCP)(HOST = testserver)(PORT = 1521))
    )
  )

ADR_BASE_LISTENER = D:\Oracle

Обратите внимание на строку:

(ENV = "EXTPROC_DLLS=ANY")

Это установка переменных окружения, я рекомендую в этом месте вместо параметра ANY установить название вашей DLL, так советуют в документации, вроде как из соображений безопасности.

5. Внесите изменения в файлы tnsnames.ora, если вы ставили на компьютер только два дистрибутива, как описано в этой статье, то таких файлов у вас будет два. Возможно, что изменить достаточно только один, но я не могу сказать точно какой, поэтому лучше поменять все. Добавить нужно следующие строки:


EXTPROC_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(Key = IPCKey))
    )
    (CONNECT_DATA =
      (SID = PLSExtProc)
      (PRESENTATION = RO)
    )
  )

6. Перезапустите LISTENER.

Я предполагаю, что вам известно, как подключать DLL в самой базе данных, поэтому в этой статье этот вопрос не рассматривается.

Известны следующие грабли:

— не стартует EXTPROC32 (переименованный из EXTPROC). При вызове DLL из Oracle программа должна появиться в списке задач компьютера с пометкой *32, если ее нет, то наверняка неверно прописаны пути в PATH
— EXTPROC32 стартует, но DLL не вызывается. Необходимо проверить путь в LIBRARY к ней и название DLL-ки, возможно Oracle не может ее найти.
— если пути верные, необходимо проверить доступ к папке ..\BIN, возможно учетная запись с которой запускается LISTENER не имеет на нее прав.





Календарь


Архив