Более 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 не имеет на нее прав.