четверг, 26 октября 2017 г.

Windows: установка Oracle Instant Client

Понадобилось тут прицепиться из-под Windows 2003 к базе на Oracle 11g, если не ошибаюсь. Гугль вывел на страницу загрузки разных вариантов Oracle Instant Client.

Под линуксом всё оказалось просто: скачал нужный архив, распаковал из него папку instantclient_12_2, в строгом соответствии с инструкциями сделал пару линков на нужные библиотеки, прописал в /etc/ld.so.conf полный путь этого самого instantclient_12_2 и вызвал ldconfig. Всё. SQL*Plus сразу начал цепляться куда надо, и осталась одна проблема: Python 2.7 через cx_Oracle не сразу понял русские буквы, и потребовалось добавить в начало скрипта конструкцию:
import os
os.environ["NLS_LANG"] = "American_America.AL32UTF8"
А для SQL*Plus не потребовалось и этого.

Иное дело Windows 2003. Под ним я тоже распаковал instantclient_12_2, в эту же папку сгрузил файлы из архивов для ODBC и SQL*Plus, добавил её полный путь в системную переменную окружения PATH и попытался создать системный DSN. Безуспешно. На экран вывалились одна за одной ошибки "Не удается загрузить программы установки для драйвера ODBC Oracle in instantclient_12_2 из-за системной ошибки с кодом 127" и "Не удается загрузить программу установки или библиотеку транслятора", и начался квест, закончившийся полным провалом. Ставлю Microsoft Visual Studio 2013 Redistributable - не помогает. Нахожу замечательную утилиту Dependency Walker 2.2, которая, по аналогии с линуксовой ldd показывает зависимости библиотек, натравливаю её на sqora32.dll и sqoras32.dll, выясняется, что этим библиотекам для счастья нужны mfc110.dll и msvcr110.dll, нахожу их в установленных каких-то левых программах, копирую в instantclient_12_2 - всё без толку. Мало того, даже sqlplus.exe запускаться не желает. Может, в оракле перепутали 32-х и 64-х битную версии?

Разбираться не стал. Снёс Instant Client 12.2, поставил Instant Client 11.2. Тому тоже не хватает библиотек, на этот раз mfc80.dll и msvcr80.dll. Их найти легче, у меня они валялись в установленном клиенте SQL Server 2005. Подпихнул их в папку instantclient_11_2, окно настройки свойств подключения появилось.

Но на этом приключения не закончились. Как известно, описания оракловских подключений хранятся в файле tnsnames.ora, путь к папке которого по идее должен быть указан в переменной окружения TNS_ADMIN. Описываю своё подключение, выбираю его в окне настройки свойств "Oracle ODBC Driver Configuration" в поле TNS Sеrvice Name, пытаюсь сделать проверку подключения - получаю ошибку "ORA-12154 TNS:could not resolve the connect identifier specified". Пришлось схитрить: в поле TNS Sеrvice Name прописать подключение в формате host:port/service_name.

Ладно, так или иначе, подключился. Опять возникла проблема с русскими буквами. Причем на ровном месте. В SQL*Plus выдаётся всё хорошо, запрос
select * from v$nls_parameters where parameter like '%CHARACTERSET%';
показывает обнадёживающее "CL8MSWIN1251", то есть, никакая перекодировка не нужна, но простейший ASP-скрипт в кодировке cp1251:
Dim Conn
Set Conn = Server.CreateObject("ADODB.Connection")

Conn.Open "Provider=MSDASQL.1;Password=***;Persist Security Info=True;User ID=huh-muh;Data Source=MYORA"

Set RS = Server.CreateObject("ADODB.Recordset")
strSQL = "select 'привет' from dual"

RS.Open strSQL, Conn

RS.MoveFirst
Response.Write RS.Fields(0)

RS.Close
Set RS = Nothing

Conn.Close
Set Conn = Nothing
вместо обнадёживающего "привет" рисует на странице удручающие знаки вопроса: "??????". Оказывается, надо прописать параметр NLS_LANG=RUSSIAN_CIS.CL8MSWIN1251, но где это сделать, совершенно непонятно. В конце концов, пристроил этот параметр в реестр:
[HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE]
"NLS_LANG"="RUSSIAN_CIS.CL8MSWIN1251"
Правда, после этого неожиданно русифицировались SQL*Plus и сообщения оракла об ошибках, но и чёрт с ними. Главное, ASP-скрипты перестали глючить.

Комментариев нет:

Отправить комментарий