警告:因本文所作的任何行為所致的損失,本人不付任何責任,請自行評估
由於我的作業要求,我必須用ODBC來連Oracle的Database,但我又不想為此將我架好玩的server灌一個windows,所以才做了這些嘗試,但由於僅僅以為了交作業為出發點,解決方法不考慮後果,不擇手段,所以可能的風險,自行承擔
安裝
先裝unixODBC及php5-odbc
sudo apt-get install unixodbc
sudo apt-get install php5-odbc
如果只有要用Oracle的話unixodbc-bin就不用裝了,裡面包含了圖形介面的設定程式,可是設定Oracle也沒比較方便,Oracle沒提供圖形介面的設定driver。
在/etc/apt/sources.list加入
#oracle
deb http://oss.oracle.com/debian unstable main non-free
然後加入金鑰,並更新,然後安裝oracle-xe-client,只是要連接的話不需要安裝到完整的oracle-xe
wget http://oss.oracle.com/el4/RPM-GPG-KEY-oracle -O- | sudo apt-key add -
sudo apt-get update
sudo apt-get install oracle-xe-client
裝好了,沒事了嗎?
要是只有這樣我就不會寫這篇了= =a
設定Oracle及ODBC
新增/etc/tnsnames.ora,內容類似下面,/${請把這串東西替換成}/應該有的樣子/
${任意名字} =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = ${IP位址})(PORT = ${PORT位址}))
)
(CONNECT_DATA =
(SERVICE_NAME = ${資料庫名稱})
)
)
執行,${DSN名字}是等一下要呼叫這個ODBC所用的名稱,隨你命名。
sudo /usr/lib/oracle/xe/app/oracle/product/10.2.0/client/odbc/utl/odbc_update_ini.sh \
/ /usr/lib/oracle/xe/app/oracle/product/10.2.0/client/lib ${DSN名字}
最後編輯/etc/odbc.ini的[${DSN名字}]部份,其中的ServerName改成剛剛的${任意名字}
ServerName = ${任意名字}
除錯-動態連結檔
要是你現在就用php的odbc_connect(),你可能得到以下訊息
Warning: odbc_connect() [function.odbc-connect]: SQL error: [unixODBC][Driver Manager]Can't open lib '/usr/lib/oracle/xe/app/oracle/product/10.2.0/client/lib/libsqora.so.10.1' : libclntsh.so.10.1: cannot open shared object file: No such file or directory, SQL state 01000 in SQLConnect in /ooo/xxx.php on line xxx
這是因為連結不到動態連結檔,有兩個解法:
法1,我是用此方法
告訴系統哪裡有,編輯/etc/ld.so.conf加入
/usr/lib/oracle/xe/app/oracle/product/10.2.0/client/lib
然後執行ldconfig
sudo ldconfig
法2
直接用軟連結把檔案連結到系統找得到的地方
sudo ln -s /usr/lib/oracle/xe/app/oracle/product/10.2.0/client/lib/libclntsh.so.10.1 /usr/lib/
sudo ln -s /usr/lib/oracle/xe/app/oracle/product/10.2.0/client/lib/libnnz10.so /usr/lib
除錯-php
現在就用php的odbc_connect(),恩,沒錯誤訊息,連線成功,但只要一送出query,如:執行odbc_exec(),你可能得到下面這個錯誤訊息
Warning: odbc_exec(): SQL error: [unixODBC][Driver Manager]Driver does not support this function, SQL state IM001 in SQLSetStmtOption in ooo/xxx.php on line xxx
這個問題,從我在PHP Bugs找到的資料,要重新編譯php。如果你是使用ubuntu6.06或7.10,我把編譯好的放在以下位址
for ubuntu 7.10
請備份/usr/lib/php5/20060613+lfs/odbc.so並用這個檔案取代,這是這個檔案的md5sum
721ea9af7f829975f2eeaeda5c81a369 odbc.so
for ubuntu 6.06
請備份/usr/lib/php5/20051025/odbc.so並用這個檔案取代(badongo好像不能傳同樣檔名的東西,請自己改回odbc.so),這是這個檔案的md5sum
30584a01fbf5599eb109cac1457a07d8 odbc.so
為了方便,我連送出警告訊息都註解掉了,因此要不要使用這些so檔,請自行掙著。
更多資料
PHP Bugs: #34852: [PATCH] Failure in odbc_exec() using oracle-supplied odbc driver
Installing Oracle Database XE on Debian, Ubuntu, and Kubuntu
留言列表