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