OQL與SQL_92非常接近,但擴(kuò)展了復(fù)雜對(duì)象、對(duì)象標(biāo)識(shí)、路徑表達(dá)式、多態(tài)、操作調(diào)用和遲聯(lián)編等面向?qū)ο蟾拍?。?duì)象" />
時(shí)間:2022-12-18 18:30:01 | 來(lái)源:信息時(shí)代
時(shí)間:2022-12-18 18:30:01 來(lái)源:信息時(shí)代
對(duì)象查詢語(yǔ)言 : 采用類似于SQL的語(yǔ)法,對(duì)對(duì)象數(shù)據(jù)庫(kù)進(jìn)行說明性的存取訪問。
OQL與SQL_92非常接近,但擴(kuò)展了復(fù)雜對(duì)象、對(duì)象標(biāo)識(shí)、路徑表達(dá)式、多態(tài)、操作調(diào)用和遲聯(lián)編等面向?qū)ο蟾拍?。?duì)象查詢語(yǔ)言既可以用于關(guān)聯(lián)訪問,也可以用于導(dǎo)航訪問。關(guān)聯(lián)查詢返回一個(gè)對(duì)象集合,這些對(duì)象的定位由對(duì)象數(shù)據(jù)管理系統(tǒng)負(fù)責(zé),應(yīng)用程序無(wú)需關(guān)心。導(dǎo)航查詢?cè)L問單個(gè)對(duì)象,對(duì)象之間的聯(lián)系被用來(lái)從一個(gè)對(duì)象導(dǎo)航到另一個(gè)對(duì)象,應(yīng)用程序需要指定訪問所要求對(duì)象的過程。ODMG3.0標(biāo)準(zhǔn)中OQL的主要內(nèi)容包括:
(1)查詢輸入和結(jié)果(query input and result): 作為一種獨(dú)立語(yǔ)言,OQL允許用名字查詢指定對(duì)象,這些名字是進(jìn)入數(shù)據(jù)庫(kù)的入口點(diǎn),一個(gè)名字可以指任意一種對(duì)象,如原子、結(jié)構(gòu)、集合或文字等。作為一種嵌入式語(yǔ)言,OQL允許查詢通過產(chǎn)生原子、結(jié)構(gòu)、集合和文字的表達(dá)式的本機(jī)語(yǔ)言支持的指定對(duì)象。一個(gè)OQL查詢是一個(gè)傳遞對(duì)象的函數(shù),對(duì)象的類型可以從提交給查詢表達(dá)式的操作符中推導(dǎo)出來(lái)。
(2)對(duì)象標(biāo)識(shí)處理(dealing with object identity):查詢語(yǔ)言同時(shí)支持對(duì)象和文字查詢,這依賴于這些對(duì)象的構(gòu)造和選擇方式。使用類型名構(gòu)造函數(shù)創(chuàng)建一個(gè)帶標(biāo)識(shí)的對(duì)象,通過精確的表達(dá)式可以查詢現(xiàn)有對(duì)象,查詢結(jié)果可以是具有對(duì)象標(biāo)識(shí),也可是不具有對(duì)象標(biāo)識(shí)的對(duì)象。
(3)路徑表達(dá)式(path expressions): OQL中通過具名對(duì)象可以進(jìn)入數(shù)據(jù)庫(kù),但更常用的是通過一個(gè)對(duì)象導(dǎo)航到所需數(shù)據(jù)。OQL提供路徑表達(dá)式機(jī)制,使得用戶可以順著對(duì)象間的簡(jiǎn)單關(guān)系進(jìn)入復(fù)雜對(duì)象,OQL的路徑表達(dá)式中支持謂詞、邏輯運(yùn)算和連接操作。
(4)未定義值(undefined values): 查詢nil對(duì)象特性的結(jié)果是UNDEFINED。在OQL語(yǔ)言中,UNDEFINED是一種特殊的文字值,該值對(duì)任何文字或?qū)ο箢愋蛠?lái)說都是一個(gè)有意義的值。
(5)方法調(diào)用(method invoking):OQL允許用戶在任何地方調(diào)用方法的結(jié)果類型與查詢中期望類型相匹配的帶參數(shù)或不帶參數(shù)的方法,調(diào)用一個(gè)方法的概念與訪問一個(gè)屬性或遍歷一個(gè)關(guān)系非常相似(對(duì)屬性或關(guān)系的訪問可以看成是調(diào)用一個(gè)不帶參數(shù)的方法),這種靈活的語(yǔ)法可使用戶無(wú)需知道特性是存儲(chǔ)的或是計(jì)算的,若屬性和方法名存在沖突時(shí),則可在方法調(diào)用時(shí)在方法后面加上括號(hào)解決。
(6)多態(tài)(polymorphism):面向?qū)ο蠓椒ǖ囊粋€(gè)主要特征是通過遲聯(lián)編機(jī)制,提供操作多態(tài)集合的能力,從而在這些集合的元素上實(shí)現(xiàn)一般的行為。
(7)操作符構(gòu)造(operator composition): OQL采用完全正交的操作符構(gòu)造規(guī)則,其表達(dá)能力不受限制且語(yǔ)言容易學(xué)習(xí)。目前OQL提供集合操作符(并、交、差)、全稱(all)和存在量詞(exists)、排序(sort)和分組(group by)操作符、聚合(count、sum、min、max和avg)操作符等。
(8)語(yǔ)言定義(language definition):OQL是一種表達(dá)式語(yǔ)言,一個(gè)表達(dá)式返回的結(jié)果可能是一個(gè)對(duì)象或文字。OQL又是一種類型化的語(yǔ)言,每個(gè)查詢表達(dá)式有一個(gè)類型,這個(gè)類型可以從查詢表達(dá)式的結(jié)構(gòu)、模式類型聲明、具名對(duì)象或文字的類型中推導(dǎo)出來(lái),因此可以在編譯時(shí)或模式類型檢查時(shí)進(jìn)行查詢正確性分析。對(duì)于每個(gè)查詢表達(dá)式允許檢查類型正確性和從子表達(dá)式類型中推導(dǎo)出表達(dá)式類型。主要內(nèi)容包括:
查詢(queries):一個(gè)查詢是一個(gè)帶有不限定變量的查詢表達(dá)式。
具名查詢定義(named query definition): 如果id是一個(gè)標(biāo)識(shí)符,e是一個(gè)OQL表達(dá)式,x1,x2,…,xn是表達(dá)式e中的自由變量,t1,t2,…,tn是形式參數(shù)x1,x2,…,xn對(duì)應(yīng)的類型,則表達(dá)式define[query]id(t1x1,t2x2,…,tnxn)ase(x1,x2,…,xn)定義id為一個(gè)具名查詢。
命名空間(namescopes):在一些語(yǔ)言綁定中,類由命名空間來(lái)唯一區(qū)分,OQL中通過引入(import)語(yǔ)句在查詢中指定類名。
基礎(chǔ)表達(dá)式(elementary expressions):包括原子文字、具名對(duì)象和出現(xiàn)在SELECT-FROM-WHERE語(yǔ)句中的迭代變量、具名查詢。
構(gòu)造表達(dá)式(construction expressions): 如果T是一個(gè)類型名,具有性質(zhì)p1,p2,…,pn,t1,t2,…,tn為對(duì)應(yīng)特性的類型,如果e1,e2,…,en是類型t1′,t2′,…,tn′的表達(dá)式且ti′是ti的子類型,則T(p1::e1,p2::e2,…,pn::en)是類型T的一個(gè)表達(dá)式。
原子類型表達(dá)式(atomic type expressions):由作用在表達(dá)式上的標(biāo)準(zhǔn)一元或二元操作,以及由字符串操作構(gòu)成。
對(duì)象表達(dá)式(object expressions)。對(duì)象表達(dá)式可使用對(duì)象或文字的等或不等表達(dá)式操作構(gòu)成,并返回一個(gè)布爾值。如果表達(dá)式e的類型中有類型為T的屬性或聯(lián)系p,則可分別用表達(dá)式e.p和e-〉p提取屬性或遍歷聯(lián)系,它們的類型均為T。
集合表達(dá)式(collection expressions)。集合表達(dá)式可以由全稱量詞、存在量詞、成員測(cè)試、一元聚合算子構(gòu)成;⑨查詢表達(dá)式(select expression)。查詢表達(dá)式可以由選擇子句、分組子句、排序子句構(gòu)成。索引集合表達(dá)式(indexed collection expressions):如果e1,e2是列表或數(shù)組類型的表達(dá)式,e3,e4是整數(shù),則e1[e3],e1[e3:e4],first(e1),last(e1)及(e1+e2)都是表達(dá)式。
二元集合表達(dá)式(binary set expressions): 如果e1,e2是類型為Set或Bag的表達(dá)式,則e1,e2的集合操作并、交、差都是表達(dá)式。若〈op〉={<,<=,>,>=},e1〈op〉e2是一個(gè)布爾類型的表達(dá)式。
轉(zhuǎn)換表達(dá)式(conversion expressions):如果e是一個(gè)表達(dá)式,則element(e)檢查e是不是單個(gè)表達(dá)式,若不是則產(chǎn)生一個(gè)異常;如果e是一個(gè)list表達(dá)式,則listtoset(e)將list轉(zhuǎn)換成set表達(dá)式;如果e是一個(gè)集合表達(dá)式,則flatten(e)將集合構(gòu)成的集合轉(zhuǎn)換成集合的表達(dá)式;如果e是一個(gè)表達(dá)式,c是一個(gè)類型名,則c(e)是斷言e為類型c的對(duì)象的表達(dá)式,若不是則引發(fā)一個(gè)異常。函數(shù)和靜態(tài)方法調(diào)用(function and static method call): 如果f是類型(t1,t2,…,tn-〉t)的一個(gè)函數(shù),如果e1,e2,…,en是類型t1′,t2′,…,tn′的表達(dá)式,ti′是ti的一個(gè)子類型,且每個(gè)表達(dá)式ei都有定義,則f()和f(e1,e2,…,en)是類型t的表達(dá)式,且其值為函數(shù)返回的值或當(dāng)函數(shù)不返回任何值時(shí)為nil。如果f是具有類型(t1,t2,…,tn->t)的類型C的一個(gè)靜態(tài)函數(shù),如果e1,e2,…,en是類型t1′,t2′,…,tn′
的表達(dá)式,ti′是ti的一個(gè)子類型,且每個(gè)表達(dá)式ei都有定義,則C.f(e1,e2,…,en)是類型t的表達(dá)式,且其值為函數(shù)返回的值或當(dāng)函數(shù)不返回任何值時(shí)為nil。
特殊函數(shù)(special functions): OQL有兩個(gè)特殊函數(shù)is_defined(e)和is_undefined(e)用于判斷任意表達(dá)式e的值是否確定。
范圍規(guī)則(scope rules): 出現(xiàn)在一個(gè)查詢中的名字可按照下述規(guī)則查找: 該名字要么是當(dāng)前范圍中的一個(gè)變量,要么是由define語(yǔ)句引入的命名查詢,要么是一個(gè)命名對(duì)象即數(shù)據(jù)庫(kù)中的一個(gè)入口點(diǎn),或者是當(dāng)前范圍中一個(gè)變量的屬性名或操作名,當(dāng)不存在模糊含義時(shí),這個(gè)特性名只屬于范圍中的一個(gè)變量。
OQL既可以作為獨(dú)立的語(yǔ)言使用,也可以嵌入到另外一個(gè)語(yǔ)言中使用,目前支持的語(yǔ)言有Smalltalk,C++和Java,對(duì)象查詢語(yǔ)言還可以調(diào)用這些語(yǔ)言編寫的函數(shù)。
客戶&案例
營(yíng)銷資訊
關(guān)于我們
客戶&案例
營(yíng)銷資訊
關(guān)于我們
微信公眾號(hào)
版權(quán)所有? 億企邦 1997-2022 保留一切法律許可權(quán)利。