Wednesday, September 2, 2009

RHEL 5 配置ORACLE ODBC

ODBC效率超低,但沒辦法,有個ARCPLAN的項目要用到ODBC連ORACLE。

1.ODBC MANAGER:在LINUX中用unixODBC作為ODBC管理器。
2.ORACLE ODBC DRIVER:ORACLE官方的Instant Client Package中包含了ODBC驅動。

unixODBC要選擇2.2.12以上版本,否則跟ORACLE Instant Client Package 10.2.0.4版本不兼容。
ORACLE Instant Client Package 10.2.0.4安裝Basic和ODBC這兩個,最好再裝上SQL*Plus這個,以便檢查分析之后的配置是否有錯。

配置ODBC DRIVER(/etc/odbcinst.ini)
[oracle_driver]
Description=odbc for oracle
Driver=/usr/lib/oracle/10.2.0.4/client64/lib/libsqora.so.10.1

[ODBC]
Trace=1
Debug=1
Pooling=No

配置SYSTEM DSN(/etc/odbc.ini)
[FINE_ZHH]
Driver=oracle_driver
Description=
DSN=FINE_ZHH
ServerName=FINE_CK
Database=ora92
UserID=theusrname
Password=thepasswd
METADATA_ID=0
ENABLE_USER_CATALOG=1
ENABLE_SYNONYMS=1

在/etc/profile文件最后加上所需的環境變量,如下(具體參數需要根據自己實際修改):
#ORACLE INSTANT CLIENT
#ADD BY JOJO
ORACLE_HOME=/usr/lib/oracle/10.2.0.4/client64
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
SQLPATH=$ORACLE_HOME/lib:$SQLPATH
TNS_ADMIN=$ORACLE_HOME
PATH=$PATH:$ORACLE_HOME/bin:.
TWO_TASK=orcl

export ORACLE_HOME
export SQLPATH
export TNS_ADMIN
export LD_LIBRARY_PATH
export TWO_TASK
export PATH

保存profile文件后執行#source /etc/profile命令使設置的環境變量在不重新登錄的情況下生效。
后來發現設置LD_LIBRARY_PATH這個變量重新登錄后無法生效。GOOGLE了一下發現不建議設置這個系統全局環境變量,于是干脆就把/usr/lib/oracle/10.2.0.4/client64/lib目錄下的文件都cp到/usr/local/lib目錄下。

在$TNS_ADMIN目錄下建立sqlnet.ora文件,內容如下:
SQLNET.AUTHENTICATION_SERVICES=(NTS)
NAMES.DIRECTORY_PATH=(TNSNAMES,ONAMES,HOSTNAME)

在同一目錄下建立tnsnames.ora,內容如下(具體參數需要根據自己實際修改):
FINE_CK=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.3.3)(PORT=1521))
)
(CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=ora92)
)
)

到此為止配置都已經完成,通過sqlplus theusrname/passwd@FINE_CK命令如果能成功連接到ORACLE數據庫,那說明tnsnames.ora文件配置沒有問題。然后可以用unixODBC提供的isql FINE_CK -v命令測試ODBC配置是否正確了,成功連接的話就表明配置都沒有問題,可以使用ODBC連ORACLE了。

补充:
今天发现用2.2.14 x86_64版本的unixODBC虽然能连数据库,但在实际应用程序中无法SELECT,用ISQL工具登录执行select 1 from dual;发现报“IM003”错误。GOOGLE了一下,原来是个BUG,可以手动修改源代码,见http://forums.oracle.com/forums/thread.jspa?threadID=340030&start=15&tstart=60
一个省心的办法是直接下载测试版本的2.2.15pre,然后编译并安装。此时运行odbcinst -j;发现系统DSN和ODBC DRIVER配置文件的目录从/etc/目录改为/usr/local/etc/这个目录。要把原来的文件复制到新目录,其他不变。