Esto es lo que funcionó para mí. Mis versiones de Python y Oracle son ligeramente diferentes a las suyas, pero se debe aplicar el mismo enfoque. Solo asegúrese de que la versión del instalador binario cx_Oracle coincida con su cliente de Oracle y las versiones de Python.
Mis versiones:
- Python 2.7
- Cliente instantáneo de Oracle 11G R2
- cx_Oracle 5.0.4 (Unicode, Python 2.7, Oracle 11G)
- Windows XP SP3
Pasos:
- Descargue el paquete Oracle Instant Client. Usé instantclient-basic-win32-11.2.0.1.0.zip. Descomprímelo en C:\tu\ruta\a\instantclient_11_2
- Descargue y ejecute el instalador binario cx_Oracle. Usé cx_Oracle-5.0.4-11g-unicode.win32-py2.7.msi. Lo instalé para todos los usuarios y lo apunté a la ubicación de Python 2.7 que encontró en el registro.
- Establezca las variables de entorno ORACLE_HOME y PATH a través de un script por lotes o cualquier mecanismo que tenga sentido en el contexto de su aplicación, para que apunten al directorio de Oracle Instant Client. Consulte la fuente de oracle_python.bat a continuación. Estoy seguro de que debe haber una solución más elegante para esto, pero quería limitar mis cambios en todo el sistema tanto como fuera posible. Asegúrese de colocar el directorio de destino de Oracle Instant Client al principio de la RUTA (o al menos delante de cualquier otro directorio de cliente de Oracle). En este momento, solo estoy haciendo cosas de la línea de comandos, así que solo ejecuto oracle_python.bat en el shell antes de ejecutar cualquier programa que requiera cx_Oracle.
- Ejecute regedit y verifique si hay una clave NLS_LANG configurada en \HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE. Si es así, cambie el nombre de la clave (la cambié a NLS_LANG_OLD) o desactívela. Esta clave solo debe usarse como el valor NLS_LANG predeterminado para el cliente Oracle 7, por lo que es seguro eliminarla a menos que esté usando el cliente Oracle 7 en otro lugar. Como siempre, asegúrese de hacer una copia de seguridad de su registro antes de realizar cambios.
- Ahora, debería poder importar cx_Oracle en su programa Python. Consulte la fuente de oracle_test.py a continuación. Tenga en cuenta que tuve que establecer la conexión y las cadenas SQL en Unicode para mi versión de cx_Oracle.
Fuente:oracle_python.bat
@echo off
set ORACLE_HOME=C:\your\path\to\instantclient_11_2
set PATH=%ORACLE_HOME%;%PATH%
Fuente: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()
Problemas posibles:
- "ORA-12705:No se puede acceder a los archivos de datos NLS o se especificó un entorno no válido":me encontré con esto antes de realizar el cambio de registro NLS_LANG.
- "TypeError:el argumento 1 debe ser Unicode, no str" - si necesita establecer la cadena de conexión en Unicode.
- "TypeError:esperando Ninguno o una cadena":si necesita establecer la cadena SQL en Unicode.
- "Error de importación:error al cargar la DLL:no se pudo encontrar el procedimiento especificado". - puede indicar que cx_Oracle no puede encontrar la DLL del cliente de Oracle adecuada.