Oto, co zadziałało dla mnie. Moje wersje Pythona i Oracle różnią się nieco od twojej, ale powinno obowiązywać to samo podejście. Upewnij się tylko, że wersja instalatora binarnego cx_Oracle jest zgodna z wersją klienta Oracle i Pythona.
Moje wersje:
- Python 2.7
- Oracle Instant Client 11G R2
- cx_Oracle 5.0.4 (Unicode, Python 2.7, Oracle 11G)
- Windows XP SP3
Kroki:
- Pobierz pakiet Oracle Instant Client. Użyłem instantclient-basic-win32-11.2.0.1.0.zip. Rozpakuj go do C:\twoja\ścieżka\do\instantclient_11_2
- Pobierz i uruchom instalator binarny cx_Oracle. Użyłem cx_Oracle-5.0.4-11g-unicode.win32-py2.7.msi. Zainstalowałem go dla wszystkich użytkowników i wskazałem lokalizację Pythona 2.7, którą znalazł w rejestrze.
- Ustaw zmienne środowiskowe ORACLE_HOME i PATH za pomocą skryptu wsadowego lub innego mechanizmu, który ma sens w kontekście aplikacji, tak aby wskazywały katalog Oracle Instant Client. Zobacz źródło oracle_python.bat poniżej. Jestem pewien, że musi być na to bardziej eleganckie rozwiązanie, ale chciałem maksymalnie ograniczyć zmiany w całym systemie. Upewnij się, że docelowy katalog Oracle Instant Client jest umieszczony na początku ścieżki PATH (lub przynajmniej przed innymi katalogami klientów Oracle). W tej chwili robię tylko rzeczy z wiersza poleceń, więc po prostu uruchamiam oracle_python.bat w powłoce przed uruchomieniem jakichkolwiek programów, które wymagają cx_Oracle.
- Uruchom regedit i sprawdź, czy w \HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE jest ustawiony klucz NLS_LANG. Jeśli tak, zmień nazwę klucza (zmieniłem go na NLS_LANG_OLD) lub usuń jego ustawienie. Ten klucz powinien być używany tylko jako domyślna wartość NLS_LANG dla klienta Oracle 7, więc można go bezpiecznie usunąć, chyba że używasz klienta Oracle 7 w innym miejscu. Jak zawsze, przed wprowadzeniem zmian upewnij się, że wykonałeś kopię zapasową rejestru.
- Teraz powinieneś być w stanie zaimportować cx_Oracle do swojego programu w Pythonie. Zobacz źródło oracle_test.py poniżej. Zauważ, że musiałem ustawić połączenie i ciągi SQL na Unicode dla mojej wersji cx_Oracle.
Źródło:oracle_python.bat
@echo off
set ORACLE_HOME=C:\your\path\to\instantclient_11_2
set PATH=%ORACLE_HOME%;%PATH%
Źródło: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()
Możliwe problemy:
- „ORA-12705:Nie można uzyskać dostępu do plików danych NLS lub określono nieprawidłowe środowisko” – natknąłem się na to, zanim dokonałem zmiany w rejestrze NLS_LANG.
- "TypeError:argument 1 musi być w formacie Unicode, a nie str" - jeśli musisz ustawić ciąg połączenia na Unicode.
- "TypeError:oczekiwanie na brak lub ciąg" - jeśli chcesz ustawić ciąg SQL na Unicode.
- "ImportError:ładowanie DLL nie powiodło się:nie można znaleźć określonej procedury." - może wskazywać, że cx_Oracle nie może znaleźć odpowiedniej biblioteki DLL klienta Oracle.