警告:因本文所作的任何行為所致的損失,本人不付任何責任,請自行評估

由於我的作業要求,我必須用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

arrow
arrow
    全站熱搜

    Shenk 發表在 痞客邦 留言(1) 人氣()