假如VSSDL本地機作為Oracle Server的一個Client端,則問題將變得簡單,僅考慮C函數的實現問題即可,但是可能會存在一個復雜化的問題,即假如VSSDL本地機并非Oracle Server的Client端,則將面臨一個工作站之間或工作站與PC之間通訊的問題,解決了通訊問題就可將VSSDL存取ORACLE數據庫的操作上升到一個一般性的問題,即不論VSSDL是否在本地機也不論本地機是否是Oracle Server的一個Client端,都能實現在VSSDL中存取ORACLE數據庫的操作,原理如圖1。 通訊程序的實現采用了通訊應用程序接口socket這一API,它是TCP/ip網絡協議通訊最常用的接口。可以將socket看作網絡通訊的一個端點,為了進行網絡通訊,程序在網絡對話的每一端都需要建立一個socket,兩個socket之間的連接可以是面向連接的(點對點連接)也可以是無連接的。通訊雙方通過各自的socket接口發送或接收信息,以便完成通訊任務。本通訊程序的實現采用了面向連接的socket接口。 3.3 定義自定義功能函數 本部分的主要工作是設計開發了九個自定義功能函數并將其裝入VSSDL&127;語言中,使得用戶可以直接在VSSDL中編寫SQL語句,用戶接口友好簡單,方便易用。雖然這些自定義函數的實現離不開OCI函數和UNIX系統的Windows Sockets API的參與,但所有這些技術的應用均體現在自定義函數本身的實現里,用戶需要了解的只是SQL語言及其擴展PL/SQL語言的語法而不必去關心自定義函數的具體實現。 在VSSDL中定義的九個自定義函數如下: ① void SS—login(user—name,passWord); 遠程登錄到ORACLE數據庫 ② void SS—create(sql—statement); 執行建表操作 ③ strUCt SPRimClass *SS—select(sql—statement); 執行SQL查詢操作,以VSSDL 中數據類型SprimClass的形式返回值 ④ void SS—insert(sql—statement); 執行表數據插入操作 ⑤ void SS—delete(sql—statement); 執行表數據刪除操作 ⑥ void SS—update(sql—statement); 執行表數據修改操作 ⑦ void SS—drop(sql—statement); 執行表結構刪除操作 ⑧ void SS—declare(pl/sql—statement); 執行PL/SQL語句塊操作 ⑨ void SS—logof(); 斷開與ORACLE數據庫的連接 說明如下: a) 前八個函數的參數全是字符串類型的,第①個函數的兩個參數分別是登錄數據庫時的用戶名和口令,對第②到第⑧個函數進行調用時,用戶需將相應的SQL語句轉化成字符串的形式,如定義一個sql—statement語句如下: command := "select * from tdb001"; 注:command已在VSSDL中聲明為string型的local變量 或command := "update tdb001 set chan—quanti=0,ungot—quant=0"; b) 第③個函數SS—select(),它的返回值是結構 SprimClass型的,SprimClass是VSSDL本身定義的一種數據結構,用于跟外部C函數之間傳遞數據,作為SS—select()函數的返回值類型時,其相應的類型定義如下: class strtype { string s } 若聲明一個變量str為strtype型的,則可用str->s來表示函數的具體返回值。
c) 一個需要非凡說明的函數即第⑧個函數SS—declare(),它的參數是一個字符串型的PL/SQL語句塊。PL/SQL是SQL語言的擴展,具有過程性,可用來處理復雜的任務。在OCI程序中,使用PL/SQL塊可以: . 調用ORACLE存儲過程和存儲函數; . 把過程控制語句和幾個SQL語句相結合,作為一個單元來執行; . 使用非凡的PL/SQL功能,如光標操作和例外處理等。 這一函數的定義大大增強了VSSDL語言操作ORACLE數據庫的功能。 有了以上的九個函數,便可在VSSDL中編寫任何的SQL語句,包括SQL查詢語句、數據定義語句(DDL語句)、數據控制語句(DCL語句)和數據操縱語句(DML語句)。而如此強大的功能實現還要歸功于OCI接口的應用。 以下將VSSDL用戶端稱為Client端,而將ORACLE RDBMS端稱為Server端。前面已經提到過Server端和Client&127;端首先要完成數據和信息的傳遞,因此對應于Client端的九個自定義功能函數,在Server端也應有其相應的OCI應用程序,它們執行Client端傳來的請求并返回應答結果,當Client端接收到結果后便呈現給了用戶。 對應于VSSDL中的九個自定義函數,Server端的九個OCI處理函數如下: ① int O—login(fd,uid,lda) ② int O—create(lda,fd,create—string) ③ int O—select(lda,fd,select—string) ④ int O—insert(lda,fd,insert—string) ⑤ int O—delete(lda,fd,delete—string) ⑥ int O—update(lda,fd,update—string) ⑦ int O—drop(lda,fd,drop—string) ⑧ int O—declare(lda,fd,declare—string) ⑨ int O—logof(lda) 其中,參數fd指socket句柄,它指明了一個提供此socket信息的描述符表入口,而Client端的9個自定義函數中所使用的socket句柄是一個全局變量socket—fd,這樣用戶就不必非常清楚具體的通訊信息了,目的是使用戶接口友好易用。 Uid是指用戶名/口令; Lda是指登錄數據區; ...string是指各種SQL語句串。 在這九個OCI處理函數的實現過程中根據實際需要調用了一系列的OCI接口子例程(函數),從而使得和后端的ORACLE數據庫打交道成為可能。(需要了解更具體的情況,請與本文作者聯系。)