PowerBuilder 6.5是化石級的軟體了,會從這篇TIPS受益的人全球可能不超過10個,不過前後處理過發生過兩次問題,花了我數小時,還是寫篇心得紀念一下。

同事最近升級了電腦,因為工作需要安裝了PB 6.5,但PB 6.5一直無法連上Oracle 9.2i的資料庫,PB跟Oracle Client重覆安裝反安裝十來次也無解,於是找我幫忙。

PB6.5真是個老軟體,內建的Native Oracle介面是7.3,額外可以多裝8.0.5,上網找到的一些說明,似乎當時最新的OS是Win95,媽呀,超過十年囉! 可是很怪,除了這台新電腦外,還有多台PC也都是用PB6.5連Oracle 9.2i,行之多年。可見,它還是具備連線Oracle 9的能力,只是不知為什麼在這台機器上不行,一直會彈出Error while trying to retrieve text for error ORA-*****。(東改西改的過程中,ORA錯誤碼變過好幾次,總之,用這些訊息Google後,唯一較能確認的就是這個錯誤跟PB沒法順利找到Oracle Driver有關。)

由sqlnet.log中看到如下的訊息:

Fatal OSN connect error 12203, connecting to:
(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=BEQ)(PROGRAM=oracle80)(ARGV0=oracle80ORCL)(ARGS='(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))')))(CONNECT_DATA=(SID=ORCL)(CID=(PROGRAM=pb60.exe)(HOST=MyClientBox)(USER=TroubleShooter))))

  VERSION INFORMATION:
    TNS for 32-bit Windows: Version 2.3.4.0.0 - Production
  Time: 07-OCT-08 17:32:45
  Tracing not turned on.
  Tns error struct:
    nr err code: 12203
    TNS-12203: Message 12203 not found; No message file for product=NETWORK, facility=TNS
    ns main err code: 12538
    TNS-12538: Message 12538 not found; No message file for product=NETWORK, facility=TNS
    ns secondary err code: 12560
    nt main err code: 508
    TNS-00508: Message 508 not found; No message file for product=NETWORK, facility=TNS
    nt secondary err code: 0
    nt OS err code: 0

對PB6.5連線ORACLE的原理毫無所悉,當然也無法推斷哪個環節出了問題。在這種困境中,可以向誰尋求救贖了? 沒錯,還是Process Monitor!

開啟Process Monitor後,設定Process Name = pb60.exe作為Filter,再開啟PB6.5連線Oracle故意引發錯誤,再由File/Registry存取Log分析,另外還比對了一台正常機器連線成功的Log當做對照組。經過一番分析推敲,我猜測PB6.5找到Oracle Client版本的過程如下:

  1. 先找到pbo7306.dll
  2. 接著嘗試在所有PATH環境變數的路徑中找尋ociw32.dll, 都找不到再開始找ora805.dll, 再找不到找ora804.dll, ora803.dll, ora73.dll。也就是說它會從較高版本開始找,萬一找不到才用較低版本。

在成功的對照組中,oracle\ora92\bin\ociw32.dll會被發現,因此PB6定調採用Oracle9i Client。而有問題的機器,則不知誰在windows\system32下放了一個ociw32.dll,而system32目錄會在PATH各路徑之前被搜索,在system32下發現ociw32.dll就無法協助PB6釐清Oracle要用哪一版。

我將system32下的ociw32.dll給移除,PB6即可連上Oracle9i。

最後我的心得是,要讓PB6透過Oracle 9i Client連接資料庫,請把握以下原則: 清除program files\sybase\*, windows\system32 下的ociw32.dll,安排PATH環境變數內的路徑順序,oracle\ora92\bin排在第一個會最好。


Comments

# by SUYIA

PB 10.5 連兩個 ORACLE SERVER , 一個在PB 的DATABASE tooL 中 可以RETRIEVE STORE PROCEDURE , 另一個則是RETRIEVE 任一個都會出現 錯誤訊息: ORA-06550:第1行,第20個欄位: PLS-00302:必須宣告元件'P_HEALTH' ORA_06550:第1行,第16個欄位: PL/SQL:Statement ignored 請問有解嗎?

Post a comment