これが私のために働いたものです。私の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
手順:
- OracleInstantClientパッケージをダウンロードします。私はinstantclient-basic-win32-11.2.0.1.0.zipを使用しました。 C:\ your \ path \ to \ instanceclient_11_2 に解凍します
- cx_Oracleバイナリインストーラーをダウンロードして実行します。 cx_Oracle-5.0.4-11g-unicode.win32-py2.7.msiを使用しました。すべてのユーザーにインストールし、レジストリで見つかったPython2.7の場所を指定しました。
- バッチスクリプトまたはアプリコンテキストで意味のあるメカニズムを介してORACLE_HOMEおよびPATH環境変数を設定し、OracleInstantClientディレクトリを指すようにします。以下のoracle_python.batソースを参照してください。これにはもっと洗練された解決策があるはずですが、システム全体の変更を可能な限り制限したかったのです。ターゲットのOracleInstantClientディレクトリをPATHの先頭(または少なくとも他のOracleクライアントディレクトリの前)に配置してください。現在、私はコマンドラインの処理のみを行っているため、cx_Oracleを必要とするプログラムを実行する前に、シェルでoracle_python.batを実行するだけです。
- regeditを実行し、\ HKEY_LOCAL_MACHINE \ SOFTWARE\ORACLEにNLS_LANGキーが設定されているかどうかを確認します。その場合は、キーの名前を変更するか(NLS_LANG_OLDに変更しました)、設定を解除します。このキーは、Oracle 7クライアントのデフォルトのNLS_LANG値としてのみ使用する必要があるため、別の場所でOracle 7クライアントを使用している場合を除いて、このキーを削除しても安全です。いつものように、変更を加える前に必ずレジストリをバックアップしてください。
- これで、Pythonプログラムにcx_Oracleをインポートできるようになります。以下のoracle_test.pyソースを参照してください。私のバージョンのcx_Oracleでは、接続とSQL文字列をUnicodeに設定する必要があることに注意してください。
出典: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はstrではなくUnicodeである必要があります」-接続文字列をUnicodeに設定する必要がある場合。
- 「TypeError:Noneまたは文字列が必要です」-SQL文字列をUnicodeに設定する必要がある場合。
- 「ImportError:DLLのロードに失敗しました:指定されたプロシージャが見つかりませんでした。」 -cx_Oracleが適切なOracleクライアントDLLを見つけられないことを示している可能性があります。