2017年12月8日 星期五

Python - Using Python With Oracle Database 11g

要使用 Python 連線 Oracle,基本上要準備以下工具,目前要使用的是 Python 2.7 進行 Oracle 11g 的連線

上敘 1, 2 點基本安裝在本文就不說明,從 3, 4 進行說明

cx_oracle 主要是 python 擴充的 Library 用於 Oracle 資料庫的連線存取,而 Oracle Instance Client 則是連線時會需要使用到 oci.dll, oraociei12.dll 這兩個 dll 檔

首先先到 https://pypi.python.org/pypi/cx_Oracle/5.2.1 下載 cx_oracle,目前我使用的是 32bit windows 7 且 Python 2.7,因此選擇的版本是 32bit



安裝了了 cx_Oracle 才能在 python 中 import cx_Oracle 的 Library

但如果此時你參考網路上連線 Oracle 的程式時,你會發現出現 「ImportError: DLL load failed: 找不到指定的程序。」,會出現此錯誤主要是系統需要 Oracle Instance client 中的 oci.dll


import cx_Oracle

ip = 'IP'
port = portno
SID = 'TNS'
dsn_tns = cx_Oracle.makedsn(ip, port, SID)
con = cx_Oracle.connect( "ID", "PASSWORD", dsn_tns)
cursor = con.cursor()
cursor.close()
con.close()

因此要先到 http://www.oracle.com/technetwork/database/features/instant-client/index.html 下載 oracle instance client,因目前使用的 Oracle 版本是 11.2.0.4.0
因此目前選擇 32 bit 11.2.0.4.0 的 Oracle Instance Client
解開壓縮檔後,即可在該目錄下找到目前需要的 oci.dll 檔
將 oci.dll 檔放在 C:\Python27\Lib\site-packages (視你安裝的目錄) 下
此時則出現 「InterfaceError: Unable to acquire Oracle environment handle」
此時則再由 Oracle Client Instance 目錄下複製 oraociei11.dll 檔到 C:\Python27\Lib\site-packages (視你安裝的目錄)
此時則出現 「DatabaseError: ORA-12705: Cannot access NLS data files or invalid environment specified」 的異常,會有此錯誤最主要是目前沒有設定環境變數 NLS_LANG
針對此異常將程式修改如下,加入設定環境變數 NLS_LANG

import cx_Oracle
import os

os.environ['NLS_LANG'] = 'TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950'

ip = 'IP'
port = portno
SID = 'TNS'
dsn_tns = cx_Oracle.makedsn(ip, port, SID)
con = cx_Oracle.connect( "ID", "PASSWORD", dsn_tns)
cursor = con.cursor()
cursor.close()
con.close()

print('Connect To Oracle')

以上即可完成 oracle 的連線
環境建立起來後,如果要對 DB 下 Select SQL 則可加入以下程式

import cx_Oracle
import os

os.environ['NLS_LANG'] = 'TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950'

ip = 'IP'
port = portno
SID = 'TNS'
dsn_tns = cx_Oracle.makedsn(ip, port, SID)
con = cx_Oracle.connect( "ID", "PASSWORD", dsn_tns)
cursor = con.cursor()

cursor.execute("""
    select employee, emp_name from employee
    """)
for value1, value2 in cursor:
    print("Values:", value1, value2)

cursor.close()
con.close()

print('Connect To Oracle')

Python 要連線 Oracle 的程式相當簡單,但最大的困難是在如果未捉取 cx_Oracle 以及 Oracle Instance Client 需要的 dll 檔,但一但搞懂如何捉取對應的 cx_Oracle 與 Oracle Instance Client 其實很容易開發捉取 DB 的程式

沒有留言:

張貼留言

How to install & specified python version or distreibtuion package version in google colab

在買了 RTX 3080 要來 挖礦...  嗯~是跑機器學習後,結果發現了 GOOGLE COLAB,其實之前在「GAN 對抗式生成網路」一書就有看到,但資訊人就是什麼都想自己安裝,在本機用 Anaconda + pyCharm 弄了 GPU 環境,結果有天從新竹回家發現家裡沒...