林雪云
(福建師范大學 福清學院,福建 福清 350300)
基于OCI對于空間數據庫的訪問
——基于編程實踐
林雪云
(福建師范大學 福清學院,福建 福清 350300)
本文是作者在開發(fā)系統(tǒng)編程實踐的基礎上,介紹基于OCI對于空間數據庫的訪問,提供給從事軟件開發(fā)的工作人員用以學習與參考.
ODBC;Oracle API;OCI
ORACLE是一種適用于大型、中型和微型計算機的關系數據庫管理系統(tǒng),它使用SQL(Structured guery language)作為它的數據庫語言.
訪問Oracle數據庫有三種方法:通過ODBC數據源、基于Oracle API或OCI.
這些方法中,ODBC雖然通用但效率和靈活性較差,關于Oracle API編程的資料很少,而基于OCI進行復雜的空間數據訪問,可以提高數據訪問的效率和靈活性.
OCI調用接口(oracle Call Interface,簡稱OCI)提供了一組接口子函數,支持所有的SQL數據定義、數據操縱、查詢和事務控制等.使用ocl開發(fā)方法實質上是結構查詢語言和第三代程序設計語言結合的一種開發(fā)方法.根據目前掌握的資料,基于Ocl的對非空間數據的訪問已有成熟的函數庫可以借鑒和使用,但對于空間數據庫,可以參考的資料很少.本文將基于編程實踐上,介紹基于OCI對于空間數據庫的訪問.
Handies和descriPtors是在OCI應用中定義的透明數據結構并被直接分配,Handle是指向OCI分配的一塊存儲區(qū)的透明指針,大多數OCI應用都需要訪問存儲在handles中的信息,0CIAttrGet()和OCIAttrsetO訪問這些信息.OCI descriPtors和locators是保存特定數據信息的透明數據結構.
2.1 OCI的編程結構
OCI的編程結構為:
(l)啟動OCI程序運行環(huán)境和線程(即初始化并連接);
(2)分配必要的句柄,建立數據庫連接和用戶會話;
(3)向服務器發(fā)出SQL請求并進行必要的數據處理;
(4)釋放不再使用的請求和句柄,準備新的請求(包含錯誤處理);
(5)終止用戶會話并斷開服務器連接.
2.2 OCI程序的處理步驟
OCI程序的處理步驟見圖1.
OCI程序主要是通過分配調用相應功能的句柄,控制SQL語句的執(zhí)行來實現的.
程序的OCI流程如圖2,圖3是處理SQL語句的具體過程.
圖2為程序的底層流程,其相應功能均以程序模塊中的相應函數實現,因為不同的空間數據訪問需要不同的SQL查詢語句以及相應的處理,SpatialRelation類和Ispatialoperator類中的成員函數就是針對不同空間關系查詢和空間操作,構造不同的SQL查詢,結合Oracle Spatial,實現相應的功能.
基于OCI的空間數據庫訪問主要是將OCI與Oracle Spatial結合起來,引入面向對象的思想,完成對空間數據的操作,下面根據課題的編程實踐總結一些訪問空間數據庫的經驗.
數據結構:在oracle spatial的對象一關系模型中,空間數據是被作為幾何對象來處理的,因此在我們的程序中也引入面向對象的思想,把對空間數據的操作轉化成對對象屬性的操作.這就需要根據oracle spatial中空間對象的存儲模式,在程序中建立起相應的數據結構.這樣既簡化了編程也簡化了對空間數據的處理.IGeometry類即為程序中的空間數據結構.
SQL語句的生成和分析:
SQL語句的生成有兩種方法:一是轉化成對字符串的操作,生成需要執(zhí)行的SQL語句后,再傳遞給OCI中處理SQL語句的句柄;二是首先確定需要用戶輸入哪些變量,將用戶輸入變量用spdntf函數“綁定”到SQL語句當中,生成SQL語句.
第二種方法程序示例如下(構造判斷兩空間對象是否相等的SQL查詢):
無論用哪種方式生成SQL語句,都要調用.parse函數進行解析,必要時還要進行SQL語句的預執(zhí)行確定有哪些輸出變量和輸出變量的種類,Oraclespatial中的函數嵌入:
在對空間關系進行判定和執(zhí)行空間操作的過程中,嵌入使用Oracle Spatial中的相關函數,可以極大地簡化編程工作,示例可參見SQL語句的生成和分析.
可以把Oracle Spatial中的相關函數嵌入到SQL語句中,而后預執(zhí)行以確定函數執(zhí)行結果的輸出類型.
查詢結果的分析:
雖然在控制SQL語句的執(zhí)行過穆中已經可以確定輸出結果的類型,但因為有些是OCI程序中特定的數據類型,因此還需要與編程語言中的數據類型建立對應關系,進一步確定輸出結果的含義.這里主要涉及到數據類型的轉換、字符串的比較和空間數據坐標值的轉換.
三種提高效率的方法:
在編程過程中,發(fā)現了以下三種提高數據訪問效率的方法,當數據量較大時,這些方法可以極大地提高效率.下面對這三種方法進行簡單介紹:
(1)SQL語句的延遲執(zhí)行.為了提高性能,OCI與Oracle7版本以上的數據庫管理系統(tǒng)在處理SQL語句時允許一步或多步的延遲執(zhí)行.例如,分析SQL語句、結合輸入變量以及定義輸出變量這些步驟能延遲到該語句被執(zhí)行時才處理.
實現延遲執(zhí)行的方法有兩種:采用延遲方式連接或在oParse調用中使用設置為0的deffig參數.
(2)將空間對象“綁定”到內存,使用完畢后釋放內存空間.
(3)建立空間索引.在眾朗le數據庫中進行空間關系的查詢時必須先建立索引,進行大數據量的空間查詢時建立空間索引可以提高查詢的速度和效率.Oracle提供兩套索引機制:R tree和Quadtree,可以根據需要進行選擇.本人在開發(fā)系統(tǒng)時,選擇的是缺省Rtree索引.
在使用oracle數據庫開發(fā)系統(tǒng)過程中,對“基于OCI對于空間數據庫的訪問”的一些看法與觀點只是其中體會之一,還有如dll技術中導入與導出函數如何匹配等等,還需要進一步總結歸納.這里不再提出.
〔1〕凌志祥.Linux下Oracle應用技術及實現 [J].電子技術, 2008(10).
〔2〕肖軍.ORACLE數據庫性能調整與優(yōu)化[D].武漢大學, 2004.
〔3〕王敦,白學仲.ORACLE的OCI調用接口[J].鐵路計算機應用,1997(04).
〔4〕王二暖.Oracle DML觸發(fā)器在監(jiān)視重要表中的作用[J].昭通師范高等??茖W校學報,2005(05).
TP311.133.1
A
1673-260X(2010)02-0031-02