專利名稱:查詢語句處理裝置和查詢語句處理方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計算機(jī)技術(shù)領(lǐng)域,具體而言,涉及一種查詢語句處理裝置和一種查詢語句處理方法。
背景技術(shù):
在數(shù)據(jù)庫應(yīng)用開發(fā)中,我們的產(chǎn)品經(jīng)常需要支持不同的數(shù)據(jù)庫,例如Oracle、 DB2、SQL krver等。雖然各數(shù)據(jù)庫產(chǎn)品都支持標(biāo)準(zhǔn)sql語法規(guī)范,但都在此基礎(chǔ)上進(jìn)行了擴(kuò)展,形成了自己獨特的語法及函數(shù)。這些特殊語法雖然有利于充分發(fā)揮各數(shù)據(jù)庫產(chǎn)品本身的性能,但并不利于數(shù)據(jù)庫應(yīng)用開發(fā),如何支持異構(gòu)數(shù)據(jù)庫成為一個問題。在現(xiàn)有技術(shù)中,通常有如下兩種方式解決此類問題1.對于代碼中的靜態(tài)sql,可針對不同數(shù)據(jù)庫類型提供不同sql版本來支持;2.對于使用0/R映射框架的系統(tǒng),可以借助0/R框架支持一定程度上的數(shù)據(jù)庫差已升。方案1的問題在于易用性不夠。方案2的問題在于支持不夠全面,例如復(fù)雜的報表sql語句,無法基于0/R框架生成。因此,需求一種基于擴(kuò)展例如sql語句的查詢語言的方法,既能有效解決異構(gòu)數(shù)據(jù)庫問題,還可以提供面向業(yè)務(wù)的易用性,并且支持一定程度上的查詢語句的優(yōu)化。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問題在于,提供一種基于擴(kuò)展例如sql語句的查詢語言的方法,既能有效解決異構(gòu)數(shù)據(jù)庫問題,還可以提供面向業(yè)務(wù)的易用性,并且支持一定程度上的查詢語句的優(yōu)化。有鑒于此,本發(fā)明提供一種查詢語句處理裝置,包括規(guī)則定義模塊,設(shè)置對自定義元素進(jìn)行處理的規(guī)則;語法解析模塊,對表達(dá)式進(jìn)行解析,取得其中的自定義元素;規(guī)則處理模塊,按照規(guī)則對自定義元素進(jìn)行處理,并使用元素的處理結(jié)果組成查詢語句。通過該技術(shù)方案,通過預(yù)定的規(guī)則,將表達(dá)式的元素轉(zhuǎn)換成當(dāng)前數(shù)據(jù)庫可識別的形式,能夠使表達(dá)式適用于任何數(shù)據(jù)庫。在上述技術(shù)方案中,優(yōu)選地,規(guī)則處理模塊在自定義元素為自定義函數(shù)時,按照規(guī)則,將自定義函數(shù)處理對應(yīng)的當(dāng)前數(shù)據(jù)庫類型的函數(shù)作為處理結(jié)果,或取得自定義函數(shù)的調(diào)用結(jié)果作為處理結(jié)果。通過該技術(shù)方案,用戶可以在表達(dá)式中使用能夠?qū)崿F(xiàn)所需功能的函數(shù),而且函數(shù)使用簡便。在上述技術(shù)方案中,優(yōu)選地,還包括轉(zhuǎn)換模塊,將查詢語句的各元素轉(zhuǎn)換為字符串形式。通過該技術(shù)方案,保證了查詢語句可以發(fā)送到數(shù)據(jù)庫后順利執(zhí)行。 在上述技術(shù)方案中,優(yōu)選地,還包括優(yōu)化模塊,還對查詢語句進(jìn)行優(yōu)化。通過該技術(shù)方案,可以使形成查詢語句結(jié)構(gòu)更加合理,更加不容易出錯。 在上述技術(shù)方案中,優(yōu)選地,對查詢語句進(jìn)行優(yōu)化具體包括消除冗余的子查詢嵌套;去除無效括號;去除無效關(guān)聯(lián)。實際上,優(yōu)化查詢語句的方式有多種,并不限于以上列舉出的幾種。本發(fā)明還提供一種查詢語句處理方法,包括步驟202,設(shè)置對自定義元素進(jìn)行處理的規(guī)則;步驟204,對表達(dá)式進(jìn)行解析,取得其中的自定義元素;步驟206,按照規(guī)則對自定義元素進(jìn)行處理,并使用元素的處理結(jié)果組成查詢語句。通過該技術(shù)方案,通過預(yù)定的規(guī)則,將表達(dá)式的元素轉(zhuǎn)換成當(dāng)前數(shù)據(jù)庫可識別的形式,能夠使表達(dá)式適用于任何數(shù)據(jù)庫。在上述技術(shù)方案中,優(yōu)選地,在步驟206中,自定義元素為自定義函數(shù)時,按照規(guī)則,將自定義函數(shù)處理對應(yīng)的當(dāng)前數(shù)據(jù)庫類型的函數(shù)作為處理結(jié)果,或取得自定義函數(shù)的調(diào)用結(jié)果作為處理結(jié)果。通過該技術(shù)方案,用戶可以在表達(dá)式中使用能夠?qū)崿F(xiàn)所需功能的函數(shù),而且函數(shù)使用簡便。在上述技術(shù)方案中,優(yōu)選地,還包括將查詢語句的各元素轉(zhuǎn)換為字符串形式。通過該技術(shù)方案,保證了查詢語句可以發(fā)送到數(shù)據(jù)庫后順利執(zhí)行。在上述技術(shù)方案中,優(yōu)選地,在步驟206中,還對查詢語句進(jìn)行優(yōu)化。通過該技術(shù)方案,可以使形成查詢語句結(jié)構(gòu)更加合理,更加不容易出錯。在上述技術(shù)方案中,優(yōu)選地,在步驟206中,對查詢語句進(jìn)行優(yōu)化具體包括消除冗余的子查詢嵌套;去除無效括號;去除無效關(guān)聯(lián)。實際上,優(yōu)化查詢語句的方式有多種, 并不限于以上列舉出的幾種。通過以上技術(shù)方案,可以實現(xiàn)一種查詢語句處理裝置和一種查詢語句處理方法, 既能有效解決異構(gòu)數(shù)據(jù)庫問題,還可以提供面向業(yè)務(wù)的易用性,并且支持一定程度上的查詢語句的優(yōu)化。
圖1是根據(jù)本發(fā)明的一個實施例的查詢語句處理裝置的框圖;圖2是根據(jù)本發(fā)明的一個實施例的查詢語句處理方法的流程圖;圖3是根據(jù)本發(fā)明的一個實施例的查詢語句處理裝置的框圖;圖4是根據(jù)本發(fā)明的一個實施例的查詢語句處理裝置的模塊示意圖;圖5是根據(jù)本發(fā)明的一個實施例的查詢語句處理裝置的模塊示意圖。
具體實施例方式為了能夠更清楚地理解本發(fā)明的上述目的、特征和優(yōu)點,下面結(jié)合附圖和具體實施方式
對本發(fā)明進(jìn)行進(jìn)一步的詳細(xì)描述。在下面的描述中闡述了很多具體細(xì)節(jié)以便于充分理解本發(fā)明,但是,本發(fā)明還可以采用其他不同于在此描述的其他方式來實施,因此,本發(fā)明并不限于下面公開的具體實施例的限制。圖1是根據(jù)本發(fā)明的一個實施例的查詢語句處理裝置的框圖。如圖1所示,本發(fā)明提供一種查詢語句處理裝置100,包括規(guī)則定義模塊102,設(shè)置對自定義元素進(jìn)行處理的規(guī)則;語法解析模塊104,對表達(dá)式進(jìn)行解析,取得其中的自定義元素;規(guī)則處理模塊106,按照規(guī)則對自定義元素進(jìn)行處理,并使用元素的處理結(jié)果組成查詢語句。通過該技術(shù)方案,通過預(yù)定的規(guī)則,將表達(dá)式的元素轉(zhuǎn)換成當(dāng)前數(shù)據(jù)庫可識別的形式,能夠使表達(dá)式適用于任何數(shù)據(jù)庫。在上述技術(shù)方案中,規(guī)則處理模塊106在自定義元素為自定義函數(shù)時,按照規(guī)則, 將自定義函數(shù)處理對應(yīng)的當(dāng)前數(shù)據(jù)庫類型的函數(shù)作為處理結(jié)果,或取得自定義函數(shù)的調(diào)用結(jié)果作為處理結(jié)果。通過該技術(shù)方案,用戶可以在表達(dá)式中使用能夠?qū)崿F(xiàn)所需功能的函數(shù), 而且函數(shù)使用簡便。在上述技術(shù)方案中,還包括轉(zhuǎn)換模塊108,將查詢語句的各元素轉(zhuǎn)換為字符串形式。通過該技術(shù)方案,保證了查詢語句可以發(fā)送到數(shù)據(jù)庫后順利執(zhí)行。在上述技術(shù)方案中,還包括優(yōu)化模塊110,還對查詢語句進(jìn)行優(yōu)化。通過該技術(shù)方案,可以使形成查詢語句結(jié)構(gòu)更加合理,更加不容易出錯。在上述技術(shù)方案中,對查詢語句進(jìn)行優(yōu)化具體包括消除冗余的子查詢嵌套;去除無效括號;去除無效關(guān)聯(lián)。實際上,優(yōu)化查詢語句的方式有多種,并不限于以上列舉出的幾種。圖2是根據(jù)本發(fā)明的一個實施例的查詢語句處理方法的流程圖。如圖2所示,本發(fā)明還提供一種查詢語句處理方法,包括步驟202,設(shè)置對自定義元素進(jìn)行處理的規(guī)則;步驟204,對表達(dá)式進(jìn)行解析,取得其中的自定義元素;步驟206,按照規(guī)則對自定義元素進(jìn)行處理,并使用元素的處理結(jié)果組成查詢語句。通過該技術(shù)方案,通過預(yù)定的規(guī)則,將表達(dá)式的元素轉(zhuǎn)換成當(dāng)前數(shù)據(jù)庫可識別的形式,能夠使表達(dá)式適用于任何數(shù)據(jù)庫。在上述技術(shù)方案中,在步驟206中,自定義元素為自定義函數(shù)時,按照規(guī)則,將自定義函數(shù)處理對應(yīng)的當(dāng)前數(shù)據(jù)庫類型的函數(shù)作為處理結(jié)果,或取得自定義函數(shù)的調(diào)用結(jié)果作為處理結(jié)果。通過該技術(shù)方案,用戶可以在表達(dá)式中使用能夠?qū)崿F(xiàn)所需功能的函數(shù),而且函數(shù)使用簡便。在上述技術(shù)方案中,還包括將查詢語句的各元素轉(zhuǎn)換為字符串形式。通過該技術(shù)方案,保證了查詢語句可以發(fā)送到數(shù)據(jù)庫后順利執(zhí)行。在上述技術(shù)方案中,在步驟206中,還對查詢語句進(jìn)行優(yōu)化。通過該技術(shù)方案,可以使形成查詢語句結(jié)構(gòu)更加合理,更加不容易出錯。在上述技術(shù)方案中,在步驟206中,對查詢語句進(jìn)行優(yōu)化具體包括消除冗余的子查詢嵌套;去除無效括號;去除無效關(guān)聯(lián)。實際上,優(yōu)化查詢語句的方式有多種,并不限于以上列舉出的幾種。圖3是根據(jù)本發(fā)明的一個實施例的查詢語句處理裝置的框圖?;趕ql語言,本實施例提供了一種查詢語句處理裝置,能夠?qū)崿F(xiàn)函數(shù)擴(kuò)展、規(guī)則擴(kuò)展等?;谶@些擴(kuò)展,可以實現(xiàn)封裝業(yè)務(wù)復(fù)雜性,能夠用sql語句來調(diào)用執(zhí)行復(fù)雜業(yè)務(wù)邏輯,從而擴(kuò)大了 sql語句的功能。該裝置的具體模塊如圖3所示語法解析器302 語法解析器302基于JavaCC生成。此解析器302能對sql表達(dá)式進(jìn)行詞法分析、 語法分析,進(jìn)而把sql表達(dá)式各元素對象化,以利于進(jìn)行后續(xù)對各元素的操作。規(guī)則處理器304 基于sql語句的擴(kuò)展是通過規(guī)則處理器304來實現(xiàn)。規(guī)則處理器處理自定義函數(shù)、 自定義表達(dá)式,最終形成面向具體數(shù)據(jù)庫的sql語句。
設(shè)置的規(guī)則支持?jǐn)U展,自定義規(guī)則可注冊在配置文件中。如圖4所示,規(guī)則處理器 304會讀取該文件從而加載所有配置的規(guī)則,在執(zhí)行時,規(guī)則處理器會依次調(diào)用各規(guī)則。函數(shù)規(guī)則處理是規(guī)則處理中重要的一塊,函數(shù)的擴(kuò)展執(zhí)行都是基于此規(guī)則來處理。本實施例中,同樣提供了函數(shù)的擴(kuò)展、注冊機(jī)制,規(guī)則處理器302中的函數(shù)處理器 402會加載該配置文件,讀取所有定義的函數(shù)擴(kuò)展。在執(zhí)行表達(dá)式解析時,遍歷訪問表達(dá)式的各元素,如果判定為擴(kuò)展函數(shù),則會調(diào)用該函數(shù)的執(zhí)行器進(jìn)行處理。開發(fā)人員實現(xiàn)自定義函數(shù)只需要做如下步驟實現(xiàn)函數(shù)的接口,并且在配置文件中進(jìn)行注冊。然后,就可以在表達(dá)式中直接使用該函數(shù)。舉例來說,獲取字符串長度的函數(shù), 在各數(shù)據(jù)庫中函數(shù)名是不同的。SqBerver中是len(),DB2、Oracle中是length ()。針對這類數(shù)據(jù)庫差異,可使用自定義函數(shù)IengthO實現(xiàn),在表達(dá)式中直接使用length (),規(guī)則處理器在處理表達(dá)式中的sql對象時,會遍歷訪問每個sql元素,如果訪問到IengthO函數(shù),就會將該函數(shù)轉(zhuǎn)換成當(dāng)前數(shù)據(jù)庫類型的函數(shù)。Sql 優(yōu)化器 306 針對sql語句進(jìn)行優(yōu)化,例如消除冗余的子查詢嵌套來展平sql語句、去除無效括號、去除無效join關(guān)聯(lián)等。Sql 轉(zhuǎn)換器 308 把最終sql對象翻譯為字符串形式的sql語句。也即遍歷訪問表達(dá)式中的各元素, 返回各元素的字符串形式,拼接成完整sql語句。需要注意的是,雖然以上實施例中采用sql語句進(jìn)行說明,但實際上,進(jìn)行數(shù)據(jù)庫操作的多種查詢語言都適用本發(fā)明的技術(shù)方案。根據(jù)以上技術(shù)方案,可以實現(xiàn)一種查詢語句處理裝置和一種查詢語句方法,其特占是·支持異構(gòu)數(shù)據(jù)庫針對數(shù)據(jù)庫差異,尤其是函數(shù)差異,提供了統(tǒng)一的函數(shù)處理方案。在編寫表達(dá)式時使用這些函數(shù),解析器會翻譯成具體數(shù)據(jù)庫方言。面向業(yè)務(wù)支持?jǐn)U展,開發(fā)人員可以把復(fù)雜sql表達(dá)式或復(fù)雜業(yè)務(wù)邏輯封裝為具有特定業(yè)務(wù)含義的函數(shù),在編寫表達(dá)式時,針對相同邏輯,可直接使用該函數(shù),在簡化sql表達(dá)式的同時更突出了業(yè)務(wù)特性。舉例來說,可以實現(xiàn)一種取庫房某種物料的可用數(shù)量的函數(shù),命名為 getQUantity(庫房編碼,物料編碼)。有了該函數(shù),就可以直接編寫如下表達(dá)式來查詢相關(guān)數(shù)據(jù)Select^from getQuantity (庫房編碼,物料編碼)當(dāng)然,該函數(shù)還可以和其他sql元素結(jié)合使用來實現(xiàn)更復(fù)雜的功能。易用性用戶在編寫sql語句時,可以直接使用語法規(guī)則支持的函數(shù)等元素,數(shù)據(jù)庫差異、 業(yè)務(wù)函數(shù)處理等可以全部交由解析器和規(guī)則處理器處理。Sql 優(yōu)化我們的解析引擎支持一定程度上的sql優(yōu)化。例如冗余的子查詢嵌套、無效的括號、無效的關(guān)聯(lián)等。實現(xiàn)代碼與sql語句的解耦在開發(fā)數(shù)據(jù)庫應(yīng)用時,總避免不了 sql語句與代碼的嵌套耦合。尤其在拼接復(fù)雜的報表sql語句過程中,總是夾雜著業(yè)務(wù)邏輯的代碼。利用我們的擴(kuò)展機(jī)制,可以把代碼邏輯封裝到函數(shù)實現(xiàn)中,在sq語句1中直接拼寫該函數(shù)即可。這樣就能減少代碼與sql語句的耦合,使sql結(jié)構(gòu)更清晰、目的性更明確。以上所述僅為本發(fā)明的優(yōu)選實施例而已,并不用于限制本發(fā)明,對于本領(lǐng)域的技術(shù)人員來說,本發(fā)明可以有各種更改和變化。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
1.一種查詢語句處理裝置,其特征在于,包括規(guī)則定義模塊,設(shè)置對自定義元素進(jìn)行處理的規(guī)則; 語法解析模塊,對表達(dá)式進(jìn)行解析,取得其中的所述自定義元素; 規(guī)則處理模塊,按照所述規(guī)則對所述自定義元素進(jìn)行處理,并使用所述元素的處理結(jié)果組成查詢語句。
2.根據(jù)權(quán)利要求1所述的查詢語句處理裝置,其特征在于,所述規(guī)則處理模塊在所述自定義元素為自定義函數(shù)時,按照所述規(guī)則,將所述自定義函數(shù)處理對應(yīng)的當(dāng)前數(shù)據(jù)庫類型的函數(shù)作為所述處理結(jié)果,或取得所述自定義函數(shù)的調(diào)用結(jié)果作為所述處理結(jié)果。
3.根據(jù)權(quán)利要求1所述的查詢語句處理裝置,其特征在于,還包括 轉(zhuǎn)換模塊,將所述查詢語句的各元素轉(zhuǎn)換為字符串形式。
4.根據(jù)權(quán)利要求1至3中任一項所述的查詢語句處理裝置,其特征在于,還包括 優(yōu)化模塊,還對所述查詢語句進(jìn)行優(yōu)化。
5.根據(jù)權(quán)利要求4所述的查詢語句處理裝置,其特征在于,對所述查詢語句進(jìn)行優(yōu)化具體包括消除冗余的子查詢嵌套; 去除無效括號; 去除無效關(guān)聯(lián)。
6.一種查詢語句處理方法,其特征在于,包括 步驟202,設(shè)置對自定義元素進(jìn)行處理的規(guī)則;步驟204,對表達(dá)式進(jìn)行解析,取得其中的所述自定義元素;步驟206,按照所述規(guī)則對所述自定義元素進(jìn)行處理,并使用所述元素的處理結(jié)果組成查詢語句。
7.根據(jù)權(quán)利要求6所述的查詢語句處理方法,其特征在于,在所述步驟206中,所述自定義元素為自定義函數(shù)時,按照所述規(guī)則,將所述自定義函數(shù)處理對應(yīng)的當(dāng)前數(shù)據(jù)庫類型的函數(shù)作為所述處理結(jié)果,或取得所述自定義函數(shù)的調(diào)用結(jié)果作為所述處理結(jié)果。
8.根據(jù)權(quán)利要求6所述的查詢語句處理方法,其特征在于,還包括 將所述查詢語句的各元素轉(zhuǎn)換為字符串形式。
9.根據(jù)權(quán)利要求6至8中任一項所述的查詢語句處理方法,其特征在于,在所述步驟 206中,還對所述查詢語句進(jìn)行優(yōu)化。
10.根據(jù)權(quán)利要求9所述的查詢語句處理方法,其特征在于,在所述步驟206中,對所述查詢語句進(jìn)行優(yōu)化具體包括消除冗余的子查詢嵌套; 去除無效括號; 去除無效關(guān)聯(lián)。
全文摘要
本發(fā)明提供一種查詢語句處理裝置和一種查詢語句處理方法。其中,查詢語句處理裝置包括規(guī)則定義模塊102,設(shè)置對自定義元素進(jìn)行處理的規(guī)則;語法解析模塊104,對表達(dá)式進(jìn)行解析,取得其中的自定義元素;規(guī)則處理模塊106,按照規(guī)則對自定義元素進(jìn)行處理,并使用元素的處理結(jié)果組成查詢語句。通過本發(fā)明,通過預(yù)定的規(guī)則,將表達(dá)式的元素轉(zhuǎn)換成當(dāng)前數(shù)據(jù)庫可識別的形式,能夠使表達(dá)式適用于任何數(shù)據(jù)庫。
文檔編號G06F17/30GK102253984SQ20111017747
公開日2011年11月23日 申請日期2011年6月28日 優(yōu)先權(quán)日2011年6月28日
發(fā)明者邊傳猛 申請人:用友軟件股份有限公司