unixODBC編程(一)安裝配置ODBC
訪問www.tomcoding.com網站,學習Oracle內部數據結構,詳細文檔說明,下載Oracle的exp/imp,DUL,logminer,ASM工具的源代碼,學習高技術含量的內容。
在類Unix的操作系統環境中訪問數據庫,如果想要有好的移植性,或者更換數據庫而不需要修改代碼,最好的方式就是用ODBC訪問數據庫。ODBC是微軟公司在windows環境中訪問不同的數據庫而定義的統一訪問接口,在Unix環境中有一個軟件包叫做unixODBC,使用它可以用同樣的函數來訪問數據庫。
在使用unixODBC之前要先安裝它,從官網unixODBC下載最新的軟件包,例如unixODBC-2.3.12.tar.gz,這是一個源代碼壓縮文件,需要編譯后安裝。下面以linux下安裝unixODBC為例,安裝到/home/oracle目錄下,配置oracle的ODBC驅動程序,看一下操作步驟。
以oracle用戶登錄linux,首先把軟件包傳到一個臨時目錄下,比如/tmp目錄。
在當前目錄下解壓,tar xvfz unixODBC-2.3.12.tar.gz。
由于linux系統下默認會安裝低版本的unixODBC,為了區別開來,我們把新的unixODBC安裝在/home/oracle目錄下,然后配置使用新版本的軟件包。
進入源程序目錄,cd unixODBC-2.3.12
配置軟件編譯環境,./configure --prefix /home/oracle/unixODBC,這個命令替換默認目錄,把軟件安裝在/home/oracle/unixODBC目錄下。
編譯源代碼,make
安裝軟件包,make install
執行完上面的命令,在/home/oracle下已經創建了一個目錄unixODBC,所有頭文件,庫文件,配置文件,可執行文件都在里面。下面配置使用新的unixODBC軟件。unixODBC軟件使用兩個環境變量來找到軟件的位置和配置文件的位置,一個是ODBCHOME,指定軟件安裝的位置,一個是ODBCINI指定odbc.ini文件的位置,odbc.ini一般存放在ODBCHOME下的etc目錄中。創建一個文件odbc.env,用來存放環境變量,內容如下。
ODBCHOME=/home/oracle/unixODBC
export ODBCHOME
ODBCINI=$ODBCHOME/etc/odbc.ini
export ODBCINI
ORACLE_HOME=/u01/oracle/product/19.3.0/db_1
export ORACLE_HOME
PATH=$ODBCHOME/bin:$PATH
export PATH
LD_LIBRARY_PATH=$ODBCHOME/lib:$ORACLE_HOME/lib
export LD_LIBRARY_PATH
文件中還設置了ORACLE_HOME和LD_LIBRARY_PATH,因為后面要配置oracle的ODBC驅動程序,這是一個動態鏈接庫文件,位置在ORACLE_HOME/lib下。
執行這個環境文件設置環境變量,使用命令 . ./odbc.env
下面就要配置Oracle的驅動程序和應用程序使用的數據源名稱了。驅動程序在$ODBCHOME/etc/odbcinst.ini,編輯輸入下面的內容。
[ora19c_driver]
Description=ODBC driver for Oracle 19c
Driver=/u01/oracle/product/19.3.0/db_1/lib/libsqora.so.19.1
Setup=/u01/oracle/product/19.3.0/db_1/lib/libsqora.so.19.1
這里主要指定了Oracle ODBC動態庫的位置和名稱。
配置數據源在$ODBCHOME/etc/odbc.ini文件中,編輯輸入下面的內容。
[ora_test]
Description=Oracle ODBC test DSN
Driver=ora19c_driver
ServerName=//192.168.16.131:1521/pdb_dx
這個文件主要定義了數據源名稱(DSN)和連接數據庫的信息還有使用的驅動程序。在這里數據源名稱是ora_test,驅動程序是在odbcinst.ini中配置的ora19c_driver,連接數據庫的信息是//192.168.16.131:1521/pdb_dx,也可以是一個tnsname,替換成自己的主機IP,端口和服務名。
用isql測試一下數據源是否能用。命令為isql -v ora_test scott tiger
其中-v表示打印詳細信息,ora_test是數據源的名稱,scott是數據庫用戶名,tiger是用戶密碼。
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| echo [string] |
| quit |
| |
+---------------------------------------+
如果出現上面的信息,表示數據源配置成功,否則會顯示出錯信息。
說一下我在配置的過程中遇到的問題,還是有些不順利的地方。
第一次配置完后,用isql測試,出現下面的錯誤。
isql: symbol lookup error: /oracle11/product/11.2/lib/libsqora.so.11.1: undefined symbol: SQLGetPrivateProfileStringW
用nm libsqora.so.11.1 | grep "SQLGetPrivate"查看連接庫中的函數,確定存在上面的函數,但是在動態連接時找不到函數。網上查了半天,有人說是unixODBC的版本問題,繼續查找,在2.2.11版本之前確實沒有解決這個問題,但是現在用的是2.3.12版本,肯定已經解決這個問題了,所以不是unixODBC的版本問題,后來又查到在redhat(centOS)5.x版本中都存在這個問題,是由于這些linux版本不是Oracle的認證版本,存在bug,所以出現問題。
第二次配置,換一個linux版本,使用了centOS7,重復上面的配置步驟,最后使用isql測試。
仍然出現錯誤,libsqora.so.11.1文件打不開,奇怪了,使用命令ldd看看哪些依賴文件沒有。
ldd /oracle11/product/11.2/lib/libsqora.so.11.1
發現libodbcinst.so.1 => not found
這個文件應該在$ODBCHOME/lib下,查看一下發現只有libodbcinst.so.2文件,沒有libodbcinst.so.1,把libodbcinst.so.2拷貝成libodbcinst.so.1,然后執行isql測試,這次通過了。
第三次配置,換了Oracle版本,使用Oracle 19c,這次順利通過。

浙公網安備 33010602011771號