Ответ 1
Вот что сработало для меня. Мои версии Python и Oracle немного отличаются от ваших, но должен применяться тот же подход. Просто убедитесь, что версия cx_Oracle для двоичной установки совпадает с версией клиента Oracle и Python.
Мои версии:
- Python 2.7
- Oracle Instant Client 11G R2
- cx_Oracle 5.0.4 (Unicode, Python 2.7, Oracle 11G)
- Windows XP SP3
Шаги:
- Загрузите пакет Oracle Instant Client. Я использовал instantclient-basic-win32-11.2.0.1.0.zip. Разархивируйте его в папку C:\your\path\to\instantclient_11_2
- Загрузите и запустите установщик cx_Oracle. Я использовал cx_Oracle-5.0.4-11g-unicode.win32-py2.7.msi. Я установил его для всех пользователей и указал на его расположение в Python 2.7, найденное в реестре.
- Установите переменные среды ORACLE_HOME и PATH через пакетный script или какой-либо механизм имеет смысл в контексте вашего приложения, чтобы они указывали на каталог Oracle Instant Client. См. Источник oracle_python.bat ниже. Я уверен, что для этого должно быть более элегантное решение, но я хотел как можно больше ограничить свои общесистемные изменения. Убедитесь, что вы разместили целевой каталог Oracle Instant Client в начале PATH (или, по крайней мере, опережаете любые другие клиентские каталоги Oracle). Прямо сейчас я занимаюсь только командами, поэтому я запускаю oracle_python.bat в оболочке перед запуском любых программ, для которых требуется cx_Oracle.
- Запустите regedit и проверьте, есть ли ключ NLS_LANG в \HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE. Если это так, переименуйте ключ (я изменил его на NLS_LANG_OLD) или отменил его. Этот ключ должен использоваться только как значение NLS_LANG по умолчанию для клиента Oracle 7, поэтому его можно безопасно удалить, если вы не используете клиент Oracle 7 где-то в другом месте. Как всегда, перед внесением изменений обязательно создайте резервную копию реестра.
- Теперь вы можете импортировать cx_Oracle в свою программу Python. См. Источник oracle_test.py ниже. Обратите внимание, что мне пришлось установить соединение и строки SQL в Unicode для моей версии cx_Oracle.
Источник: oracle_python.bat
@echo off
set ORACLE_HOME=C:\your\path\to\instantclient_11_2
set PATH=%ORACLE_HOME%;%PATH%
Источник: oracle_test.py
import cx_Oracle
conn_str = u'user/[email protected]:port/service'
conn = cx_Oracle.connect(conn_str)
c = conn.cursor()
c.execute(u'select your_col_1, your_col_2 from your_table')
for row in c:
print row[0], "-", row[1]
conn.close()
Возможные проблемы:
- "ORA-12705: не удается получить доступ к файлам данных NLS или недействительной заданной среде" - я столкнулся с этим до того, как изменил реестр NLS_LANG.
- "TypeError: аргумент 1 должен быть unicode, а не str" - если вам нужно установить строку подключения в Unicode.
- "TypeError: ожидать None или string" - если вам нужно установить строку SQL в Unicode.
- "ImportError: Ошибка загрузки DLL: указанная процедура не найдена." - может указывать на то, что cx_Oracle не может найти соответствующую DLL-клиент Oracle.