cx_Oracle.DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be loaded: 解決方案
ODPI-C安裝
要在您自己的專案中使用ODPI-C,請從GitHub下載其原始碼。如果您希望將ODPI-C構建為共享庫,則會提供示例Makefile。否則,將ODPI-C原始碼新增到專案中。在Windows上,需要Visual Studio 2008或更高版本。在macOS上,需要Xcode 6或更高版本。在Linux上,需要GCC 4.4或更高版本。
使用ODPI-C的專案需要安裝Oracle客戶端庫。這些庫提供必要的網路連線,允許應用程式訪問Oracle資料庫例項。它們還為ODPI-C應用程式提供基本和高階連線管理和資料功能。
最簡單的Oracle客戶端是免費的
ODPI-C在執行時顯式載入可用的Oracle客戶端庫。這允許使用ODPI-C的程式碼只構建一次,然後使用可用的Oracle Client 18,12或11.2庫執行。如果未找到Oracle客戶端庫,則會引發錯誤“DPI-1047:無法載入Oracle客戶端庫”。
在Windows上,首先在ODPI-C庫(或應用程式二進位制檔案)所在的同一目錄中查詢Oracle客戶端庫。如果找不到它們,則Oracle客戶端庫目錄應包含在PATH
在非Windows平臺上,如果沒有Oracle客戶端位於標準作業系統搜尋路徑(例如$LD_LIBRARY_PATH
)中,則 $ORACLE_HOME
搜尋。
以下各節說明如何確保在各種平臺上正確安裝和配置Oracle客戶端,以便ODPI-C能夠找到它。
ODPI-C已經在Linux,Windows和macOS上進行了測試。其他平臺也應該有效,但尚未經過測試。
Oracle客戶端和Oracle資料庫互操作性¶
ODPI-C可以使用Oracle Client 18,12或11.2庫。
Oracle的標準客戶端 - 伺服器網路互操作性允許不同版本的Oracle客戶端和Oracle資料庫之間的連線。有關認證配置,請參閱Oracle Support的
由於單個ODPI-C二進位制檔案可以使用多個客戶端版本並訪問多個數據庫版本,因此在您的預期釋出環境中測試應用程式非常重要。較新的Oracle客戶端支援新功能,例如12.1或更高版本客戶端可用的oraaccess.xml外部配置檔案,會話池改進,18或更高版本客戶端的呼叫超時以及其他增強功能。
該函式dpiContext_getClientVersion()
可用於確定正在使用的Oracle客戶端版本,該函式 dpiConn_getServerVersion()
可用於確定連線正在訪問哪個Oracle資料庫版本。然後可以使用它們來相應地調整應用程式行為。嘗試使用特定客戶端/伺服器組合不支援的某些Oracle功能可能會導致執行時錯誤。這些包括:
- 嘗試訪問當前Oracle客戶端庫不支援的屬性時,您將收到錯誤“ORA-24315:非法屬性型別”
- 嘗試對Oracle Database 12c使用Oracle Client 11.2的隱式結果時,您將收到錯誤“ORA-29481:無法將隱式結果返回給客戶端”
- 嘗試使用Oracle Client 11.2獲取陣列DML行計數時,您將收到錯誤“DPI-1050:Oracle客戶端庫必須為12.1或更高版本”
Linux的¶
ODPI-C需要Oracle客戶端庫,可以在Oracle Instant Client或Oracle資料庫安裝中找到,也可以在完整的Oracle客戶端安裝中找到。這些庫必須是32位或64位,與您的應用程式和ODPI-C庫(如果單獨建立)匹配。
在Linux上,ODPI-C首先使用標準庫搜尋順序搜尋名為“libclntsh.so”的庫。如果找不到,則會搜尋“libclntsh.so.18.1”,“libclntsh.so.12.1”,然後搜尋“libclntsh.so.11.1”。如果找不到庫,則$ORACLE_HOME/lib/libclntsh.so
檢查。如果沒有找到庫,則返回錯誤。
Oracle Instant ClientZip¶
使用Oracle Instant Client zip檔案執行ODPI-C應用程式:
-
下載Oracle 18,12或11.2“Basic”或“Basic Light”zip檔案:64位 或32位,與您的應用程式架構相匹配。
-
將程式包解壓縮到應用程式可訪問的單個目錄中。例如:
mkdir -p /opt/oracle cd /opt/oracle unzip instantclient-basic-linux.x64-12.2.0.1.0.zip
-
libaio
使用sudo或root使用者安裝軟體包。例如:sudo yum install libaio
在某些Linux發行版上,會呼叫此包
libaio1
。 -
如果計算機上沒有其他Oracle軟體會受到影響,請將Instant Client永久新增到執行時連結路徑。例如,使用sudo或root使用者:
sudo sh -c "echo /opt/oracle/instantclient_12_2 > /etc/ld.so.conf.d/oracle-instantclient.conf" sudo ldconfig
或者,將環境變數設定
LD_LIBRARY_PATH
為Instant Client版本的相應目錄。例如:export LD_LIBRARY_PATH=/opt/oracle/instantclient_12_2:$LD_LIBRARY_PATH
-
如果您打算同定位可選的Oracle配置檔案,如
tnsnames.ora
,sqlnet.ora
或oraaccess.xml
與即時客戶端,然後建立一個network/admin
子目錄,如果它不存在。例如:mkdir -p /opt/oracle/instantclient_12_2/network/admin
這是與此Instant Client連結的應用程式的預設Oracle配置目錄。
或者,Oracle配置檔案可以放在另一個可訪問的目錄中。然後將環境變數
TNS_ADMIN
設定為該目錄名稱。
Oracle Instant ClientRPM¶
使用Oracle Instant Client RPM執行ODPI-C應用程式:
-
下載適用於您的應用程式架構的Oracle 18,12或11.2“Basic”或“Basic Light”RPM:64位 或32位。
-
使用sudo或root使用者安裝下載的RPM。例如:
sudo yum install oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm
Yum會自動安裝所需的依賴項,例如
libaio
。 -
如果計算機上沒有其他Oracle軟體會受到影響,請將Instant Client永久新增到執行時連結路徑。例如,使用sudo或root使用者:
sudo sh -c "echo /usr/lib/oracle/12.2/client64/lib > /etc/ld.so.conf.d/oracle-instantclient.conf" sudo ldconfig
或者,將環境變數設定
LD_LIBRARY_PATH
為Instant Client版本的相應目錄。例如:export LD_LIBRARY_PATH=/usr/lib/oracle/12.2/client64/lib:$LD_LIBRARY_PATH
-
如果您打算共同定位可選的Oracle配置檔案,例如
tnsnames.ora
,sqlnet.ora
或oraaccess.xml
使用Instant Client,則network/admin
在lib/
其下建立一個子目錄 (如果它不存在)。例如:sudo mkdir -p /usr/lib/oracle/12.2/client64/lib/network/admin
這是與此Instant Client連結的應用程式的預設Oracle配置目錄。
或者,Oracle配置檔案可以放在另一個可訪問的目錄中。然後將環境變數
TNS_ADMIN
設定為該目錄名稱。
本地資料庫或完整Oracle客戶端¶
ODPI-C應用程式可以使用本地Oracle資料庫或完整Oracle客戶端安裝中的Oracle Client 18,12或11.2庫。
這些庫必須是32位或64位,與您的應用程式和ODPI-C庫(如果單獨建立)匹配。
-
通過執行Oracle環境指令碼來設定所需的Oracle環境變數。例如:
source /usr/local/bin/oraenv
對於Oracle Database XE 11.2,執行:
source /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh
-
可選的Oracle配置檔案,例如
tnsnames.ora
,sqlnet.ora
或者oraaccess.xml
可以放在其中$ORACLE_HOME/network/admin
。或者,Oracle配置檔案可以放在另一個可訪問的目錄中。然後將環境變數
TNS_ADMIN
設定為該目錄名稱。
視窗¶
ODPI-C需要Oracle客戶端庫,可以在Oracle Instant Client或Oracle資料庫安裝中找到,也可以在完整的Oracle客戶端安裝中找到。這些庫必須是32位或64位,與您的應用程式和ODPI-C庫(如果單獨建立)匹配。
在Windows上,ODPI-C首先在包含ODPI-C庫(或應用程式)的目錄中查詢Oracle客戶端庫“OCI.dll”,然後使用標準庫搜尋順序進行搜尋。
Oracle客戶端庫需要存在正確的Visual Studio可再發行元件。
- Oracle 18和12.2需要VS 2013
- Oracle 12.1需要VS 2010
- Oracle 11.2需要VS 2005 64位或VS 2005 32位
Oracle Instant ClientZip¶
使用Oracle Instant Client zip檔案執行ODPI-C應用程式:
-
下載Oracle 18,12或11.2“Basic”或“Basic Light”zip檔案:64位 或32位,與您的應用程式架構相匹配。
-
例如,將程式包解壓縮到應用程式可訪問的單個目錄中
C:\oracle\instantclient_12_2
。 -
設定環境變數
PATH
以包括您在步驟2中建立的路徑。例如,在Windows 7上,PATH
在控制面板 - >系統 - >高階系統設定 - >高階 - >環境變數 - >系統變數 - >路徑中更新。 -
如果您打算共同定位可選的Oracle配置檔案,例如
tnsnames.ora
,sqlnet.ora
或oraaccess.xml
與Instant Client,則建立network\admin
子目錄(如果它不存在),例如C:\oracle\instantclient_12_2\network\admin
。這是與此Instant Client連結的應用程式的預設Oracle配置目錄。
或者,Oracle配置檔案可以放在另一個可訪問的目錄中。然後將環境變數
TNS_ADMIN
設定為該目錄名稱。
如果要將Instant Client與應用程式打包在一起,可以將Instant Client庫移動到與ODPI-C庫(或應用程式)相同的目錄中。 有關所需的最小Instant Client檔案集,請參閱Instant Client文件。沒有必要設定PATH
。這僅適用於Windows。
本地資料庫或完整Oracle客戶端¶
Oracle庫必須是32位或64位,與您的應用程式和ODPI-C庫(如果單獨建立)匹配。
要使用本地Oracle資料庫(或完整Oracle客戶端)18,12或11.2安裝中的客戶端庫來執行ODPI-C應用程式:
-
設定環境變數
PATH
以包含包含OCI.dll的路徑(如果尚未設定)。例如,在Windows 7上,PATH
在控制面板 - >系統 - >高階系統設定 - >高階 - >環境變數 - >系統變數 - >路徑中更新。 -
可選的Oracle配置檔案,例如
tnsnames.ora
,sqlnet.ora
或者oraaccess.xml
可以放在network/admin
Oracle軟體的 子目錄中。或者,Oracle配置檔案可以放在另一個可訪問的目錄中。然後將環境變數
TNS_ADMIN
設定為該目錄名稱。