專(zhuān)利名稱(chēng):一種訪問(wèn)不同類(lèi)型數(shù)據(jù)庫(kù)的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)庫(kù)領(lǐng)域,特別是涉及一種訪問(wèn)不同類(lèi)型數(shù)據(jù)庫(kù)的方法和系統(tǒng)。
背景技術(shù):
現(xiàn)有的數(shù)據(jù)庫(kù)產(chǎn)品在實(shí)現(xiàn)標(biāo)準(zhǔn)的SQL語(yǔ)法之外還支持各自特有的SQL語(yǔ) 法,這些SQL語(yǔ)法是不通用的。舉個(gè)例子在SQL SERVER中支持下面的語(yǔ) 句SELECT TOP 100 * FROM t,但在DB2下由于不支持TOP關(guān)鍵字,所以 該語(yǔ)句不能被正確編譯執(zhí)行而必須寫(xiě)成等效的語(yǔ)句SELECT * FROM t FETCH FIRST 100 ROWS ONLY??梢钥闯?,實(shí)現(xiàn)同樣的功能,即從表t中選 擇頭100條記錄,在SQL SERVER與DB2中都是可以實(shí)現(xiàn)的,但實(shí)現(xiàn)的方式 即提交的查詢(xún)語(yǔ)句卻不并相同。再比如DB2支持下面的語(yǔ)句update t as tl ... 而該語(yǔ)句在SQL SERVER中執(zhí)行卻會(huì)報(bào)語(yǔ)法不支持錯(cuò)誤。這種差異給應(yīng)用產(chǎn) 品帶來(lái)了不便 一個(gè)在某種數(shù)據(jù)庫(kù)產(chǎn)品中運(yùn)行良好的應(yīng)用,不一定能夠在其它 數(shù)據(jù)庫(kù)產(chǎn)品中正常運(yùn)行。
部分應(yīng)用通過(guò)O/RMapping工具來(lái)試圖屏蔽各ft據(jù)庫(kù)差異,如hibernate。 使用這些O/RMapping工具時(shí),開(kāi)發(fā)人員提交的是對(duì)象化的語(yǔ)句,工具負(fù)責(zé)生 成適合在特定數(shù)據(jù)庫(kù)上運(yùn)行的結(jié)構(gòu)化的SQL語(yǔ)句,它們采用翻譯對(duì)象化語(yǔ)句 的方式來(lái)屏蔽各數(shù)據(jù)庫(kù)之間的差異。
過(guò)對(duì)象化語(yǔ)句翻譯生成SQL雖然解決了各數(shù)據(jù)庫(kù)差異帶來(lái)的問(wèn)題,但它 存在以下缺點(diǎn)1、 限制SQL使用的靈活性對(duì)象化語(yǔ)句與結(jié)構(gòu)化語(yǔ)句有本質(zhì)的不同,而 現(xiàn)在的數(shù)據(jù)庫(kù)系統(tǒng)基本上都是關(guān)系數(shù)據(jù)庫(kù),這種現(xiàn)狀決定了對(duì)象化語(yǔ)句無(wú)法象 結(jié)構(gòu)化語(yǔ)句那樣靈活,無(wú)法與數(shù)據(jù)庫(kù)系統(tǒng)很好的結(jié)合。2、 很難描述復(fù)雜的SQL語(yǔ)句開(kāi)發(fā)人員提交的是對(duì)象化語(yǔ)句,而生成的 SQL語(yǔ)句卻是結(jié)構(gòu)化語(yǔ)句。這種差異導(dǎo)致工具本身無(wú)法處理復(fù)雜的SQL語(yǔ)句, 從另 一方面來(lái)說(shuō),開(kāi)發(fā)人員試圖將復(fù)雜的關(guān)聯(lián)語(yǔ)句轉(zhuǎn)為對(duì)象化的語(yǔ)句將是件困 難的事。
3、要使用某數(shù)據(jù)庫(kù)特有的語(yǔ)句必須通過(guò)接口來(lái)進(jìn)行。 一般工具都會(huì)提供 兩個(gè)接口, 一個(gè)用于處理對(duì)象化語(yǔ)句,另一個(gè)用于處理結(jié)構(gòu)化語(yǔ)句,即數(shù)據(jù)庫(kù)特有的語(yǔ)句,這種語(yǔ)句的特點(diǎn)是它不需要工具翻譯而是直接提交到數(shù)據(jù)庫(kù)。兩 個(gè)接口在使用過(guò)程中給開(kāi)發(fā)人員造成了不小的麻煩,必須選擇合適的接口,并 且在修改語(yǔ)句的時(shí)候必須同步改變接口 。發(fā)明內(nèi)容本發(fā)明所要解決的技術(shù)問(wèn)題是提供一種訪問(wèn)不同類(lèi)型數(shù)據(jù)庫(kù)的方法和系統(tǒng),通過(guò)將結(jié)構(gòu)化的通用SQL語(yǔ)句翻譯成適合在特定目標(biāo)數(shù)據(jù)庫(kù)運(yùn)行SQL語(yǔ) 句,屏蔽各種數(shù)據(jù)庫(kù)之間的差異。為了解決上述問(wèn)題,本發(fā)明公開(kāi)了一種訪問(wèn)不同類(lèi)型數(shù)據(jù)庫(kù)的方法,包括 步驟接收與目標(biāo)數(shù)據(jù)庫(kù)無(wú)關(guān)的通用SQL語(yǔ)句; 判斷目標(biāo)數(shù)據(jù)庫(kù)類(lèi)型;根據(jù)目標(biāo)數(shù)據(jù)庫(kù)類(lèi)型將通用SQL語(yǔ)句翻譯成在特定目標(biāo)數(shù)據(jù)庫(kù)中執(zhí)行的 SQL語(yǔ)句;發(fā)送所述翻譯的SQL語(yǔ)句至特定目標(biāo)數(shù)據(jù)庫(kù)。 進(jìn)一步,還包括步驟目標(biāo)數(shù)據(jù)庫(kù)執(zhí)行所述SQL語(yǔ)句,返回執(zhí)行結(jié)果。 優(yōu)選的,在所述翻譯步驟前還包括步驟判斷目標(biāo)數(shù)據(jù)庫(kù)是否支持所述通用SQL語(yǔ)句的功能,如不支持則 在目標(biāo)數(shù)據(jù)庫(kù)中預(yù)置實(shí)現(xiàn)所述通用SQL語(yǔ)句功能的存儲(chǔ)過(guò)程; 所述翻譯過(guò)程為將所述通用SQL語(yǔ)句翻譯成所述存儲(chǔ)過(guò)程的調(diào)用語(yǔ)句。其中,所述翻譯過(guò)程包括步驟預(yù)置相應(yīng)語(yǔ)法;對(duì)接收的通用SQL語(yǔ)句進(jìn)行語(yǔ)法解析;根據(jù)語(yǔ)法解析的結(jié)果輸出在特定目標(biāo)數(shù)據(jù)庫(kù)中執(zhí)行的SQL語(yǔ)句。 其中,所述語(yǔ)法解析具體步驟為 根據(jù)語(yǔ)法將通用SQL語(yǔ)句解析成語(yǔ)法樹(shù);
所述輸出在特定目標(biāo)數(shù)據(jù)庫(kù)中執(zhí)行的SQL語(yǔ)句的具體步驟為 從語(yǔ)法樹(shù)信息中依次獲取標(biāo)識(shí),輸出在特定目標(biāo)數(shù)據(jù)庫(kù)中執(zhí)行的SQL語(yǔ)句。優(yōu)先的,在所述接收通用SQL語(yǔ)句步驟后還包括判斷所述通用SQL語(yǔ)句是否以嚴(yán)dialect"為前綴,否則進(jìn)入下一步,是貝'j: 直接發(fā)送所述SQL語(yǔ)句至特定目標(biāo)數(shù)據(jù)庫(kù)。 本發(fā)明還公開(kāi)了一種訪問(wèn)不同類(lèi)型數(shù)據(jù)庫(kù)的系統(tǒng),包括 接收單元,用于接收與目標(biāo)數(shù)據(jù)庫(kù)無(wú)關(guān)的通用SQL語(yǔ)句; 第一判斷單元,用于判斷目標(biāo)數(shù)據(jù)庫(kù)類(lèi)型;翻譯單元,用于將通用SQL語(yǔ)句翻譯成在特定目標(biāo)數(shù)據(jù)庫(kù)中執(zhí)行的SQL 語(yǔ)句;發(fā)送單元,用于發(fā)送所述翻譯的SQL語(yǔ)句至特定目標(biāo)數(shù)據(jù)庫(kù)。 優(yōu)選的,還包括返回單元,用于在目標(biāo)數(shù)據(jù)庫(kù)執(zhí)行SQL語(yǔ)句后,返回執(zhí)行結(jié)果。 優(yōu)選的,還包括第二判斷單元,用于判斷目標(biāo)數(shù)據(jù)庫(kù)是否支持通用SQL語(yǔ)句的功能。 優(yōu)選的,所述翻譯單元包括 預(yù)置單元,用于預(yù)置相應(yīng)語(yǔ)法;語(yǔ)法樹(shù)解析單元,用于根據(jù)語(yǔ)法將通用SQL語(yǔ)句解析成語(yǔ)法樹(shù); 輸出單元,用于從語(yǔ)法樹(shù)信息中依次獲取標(biāo)識(shí),輸出在特定目標(biāo)數(shù)據(jù)庫(kù)中 執(zhí)行的SQL語(yǔ)句。 優(yōu)選的,還包括第三判斷單元,用于判斷通用SQL語(yǔ)句是否以嚴(yán)dialect"為前綴。 與現(xiàn)有技術(shù)相比,本發(fā)明具有以下優(yōu)點(diǎn)本發(fā)明在不同數(shù)據(jù)庫(kù)支持不同SQL語(yǔ)法的基礎(chǔ)上提出一種通用的SQL語(yǔ) 句,即KSQL語(yǔ)句。所述通用的SQL語(yǔ)句有自身的語(yǔ)法,所述語(yǔ)法可以方侵_ 地描述數(shù)據(jù)庫(kù)的各種功能,但它不能直接運(yùn)行在實(shí)際的數(shù)據(jù)庫(kù)產(chǎn)品中。外部應(yīng) 用程序不直接發(fā)送實(shí)際的與數(shù)據(jù)庫(kù)產(chǎn)品相關(guān)的SQL語(yǔ)句,而是發(fā)送通用的 SQL語(yǔ)句到翻譯層,在程序運(yùn)行時(shí),翻譯層會(huì)根據(jù)目標(biāo)數(shù)據(jù)庫(kù)類(lèi)型生成合適的SQL語(yǔ)句,并發(fā)送到目標(biāo)數(shù)據(jù)庫(kù)執(zhí)行。從而可以使應(yīng)用程序不再關(guān)心所運(yùn) 行的數(shù)據(jù)庫(kù)環(huán)境。因?yàn)楸景l(fā)明.所述的KSQL語(yǔ)法與其它的SQL語(yǔ)法一樣,都 是結(jié)構(gòu)化語(yǔ)言,所以將KSQL翻譯成特定數(shù)據(jù)庫(kù)上的SQL過(guò)程將變得簡(jiǎn)單, 同時(shí)容易編寫(xiě)與其它SQL—樣復(fù)雜的語(yǔ)句。
進(jìn)一步,翻譯結(jié)合預(yù)定義的存儲(chǔ)過(guò)程可以最大程序的屏蔽各種數(shù)據(jù)庫(kù)之間 的差異,運(yùn)行在某種數(shù)據(jù)庫(kù)上的所有SQL功能都可以在其他數(shù)據(jù)庫(kù)中實(shí)現(xiàn)。 使用語(yǔ)句前綴決定是否要對(duì)語(yǔ)句進(jìn)行翻譯避免對(duì)外發(fā)布多個(gè)不同的接口 。
圖1是本發(fā)明實(shí)施例一種訪問(wèn)不同類(lèi)型數(shù)據(jù)庫(kù)方法的流程圖; 圖2是圖1實(shí)施例所述方法中步驟103翻譯步驟的具體流程圖; 圖3是本發(fā)明第二實(shí)施例一種訪問(wèn)不同類(lèi)型數(shù)據(jù)庫(kù)方法的流程圖; 圖4是本發(fā)明第三實(shí)施例一種訪問(wèn)不同類(lèi)型數(shù)據(jù)庫(kù)方法的流程圖; 圖5是本發(fā)明實(shí)施例一種訪問(wèn)不同類(lèi)型數(shù)據(jù)庫(kù)系統(tǒng)的結(jié)構(gòu)框圖; 圖6是本發(fā)明第二實(shí)施例一種訪問(wèn)不同類(lèi)型數(shù)據(jù)庫(kù)系統(tǒng)的結(jié)構(gòu)框圖; 圖7是本發(fā)明第三實(shí)施例 一種訪問(wèn)不同類(lèi)型凄t據(jù)庫(kù)系統(tǒng)的結(jié)構(gòu)框圖。
具體實(shí)施方式
為使本發(fā)明的上述目的、特征和優(yōu)點(diǎn)能夠更加明顯易懂,下面結(jié)合附圖和具體實(shí)施方式
對(duì)本發(fā)明作進(jìn)一步詳細(xì)的說(shuō)明。
參照?qǐng)D1,示出了本發(fā)明實(shí)施例一種訪問(wèn)不同類(lèi)型數(shù)據(jù)庫(kù)方法的流程圖, 包括步驟步驟101、接收與目標(biāo)數(shù)據(jù)庫(kù)無(wú)關(guān)的通用SQL語(yǔ)句。
本發(fā)明在不同數(shù)據(jù)庫(kù)支持不同SQL語(yǔ)法的基礎(chǔ)上提出一種通用的SQL語(yǔ) 句,即KSQL語(yǔ)句。所述通用的SQL語(yǔ)句有自身的語(yǔ)法,所述語(yǔ)法可以方便 地描述數(shù)據(jù)庫(kù)的各種功能,但它不能直接運(yùn)行在具體的目標(biāo)數(shù)據(jù)庫(kù)中。因此, 使用所述通用SQL語(yǔ)句可以使外部應(yīng)用程序不再關(guān)心所運(yùn)行的數(shù)據(jù)庫(kù)環(huán)境, 提高了應(yīng)用的靈活性。在本發(fā)明實(shí)施例中,所述接收的通用SQL語(yǔ)句優(yōu)選的 是外部JAVA應(yīng)用系統(tǒng)發(fā)送的,本領(lǐng)域技術(shù)人員可以理解,所述JAVA應(yīng)用系 統(tǒng)并不限定本發(fā)明的保護(hù)范圍。
步驟102、判斷目標(biāo)數(shù)據(jù)庫(kù)類(lèi)型。獲得應(yīng)用系統(tǒng)所運(yùn)行的凄t據(jù)庫(kù)環(huán)境信息,即目標(biāo)數(shù)據(jù)庫(kù)類(lèi)型,所述數(shù)據(jù)庫(kù)環(huán)境信息保存在配置文件中,在創(chuàng)建數(shù)據(jù)庫(kù)連接時(shí)獲取。因?yàn)镵SQL語(yǔ)句是不 能在具體的數(shù)據(jù)庫(kù)中執(zhí)行的,所以在將KSQL語(yǔ)句翻譯成適合在特定目標(biāo)數(shù)據(jù) 庫(kù)執(zhí)行的SQL語(yǔ)句之前,必須先判斷其所要運(yùn)行的數(shù)據(jù)庫(kù)類(lèi)型,從而翻譯成 相應(yīng)類(lèi)型的SQL語(yǔ)句。步驟103、根據(jù)目標(biāo)數(shù)據(jù)庫(kù)類(lèi)型將通用SQL語(yǔ)句翻譯成在特定目標(biāo)數(shù)據(jù) 庫(kù)中執(zhí)行的SQL語(yǔ)句。在確定目標(biāo)數(shù)據(jù)庫(kù)類(lèi)型后,將不能在具體數(shù)據(jù)庫(kù)中執(zhí)行的KSQL語(yǔ)句翻譯 成能夠在特定目標(biāo)數(shù)據(jù)庫(kù)的執(zhí)行的SQL語(yǔ)句。所述翻譯過(guò)程及原理將在后面 進(jìn)行詳細(xì)介紹,在此先不詳述。步驟104、發(fā)送所述翻譯的SQL語(yǔ)句至特定目標(biāo)數(shù)據(jù)庫(kù)。翻譯完成后,將所述翻譯完成的適合在特定目標(biāo)數(shù)據(jù)庫(kù)執(zhí)行的SQL語(yǔ)句 發(fā)送至目標(biāo)數(shù)據(jù)庫(kù)。進(jìn)一步,還可以包括步驟105、目標(biāo)數(shù)據(jù)庫(kù)執(zhí)行所述SQL語(yǔ)句,返回執(zhí) 行結(jié)果。所述目標(biāo)數(shù)據(jù)庫(kù)執(zhí)行SQL語(yǔ)句,并返回執(zhí)行結(jié)果。對(duì)于本領(lǐng)域的普通技 術(shù)人員來(lái)說(shuō),是公知常識(shí),在此不再詳述。參照?qǐng)D2、示出了圖1實(shí)施例所述方法中步驟103翻譯步驟的具體流程圖, 所述翻譯過(guò)程具體包括步驟步驟1031、預(yù)置相應(yīng)語(yǔ)法,進(jìn)入步驟1032。步驟1032、對(duì)接收的通用SQL語(yǔ)句進(jìn)行語(yǔ)法解析。根據(jù)語(yǔ)法將通用SQL語(yǔ)句解析成語(yǔ)法樹(shù)。步驟1033、根據(jù)語(yǔ)法解析的結(jié)果輸出在特定目標(biāo)數(shù)據(jù)庫(kù)中執(zhí)行的SQL語(yǔ)句。從語(yǔ)法樹(shù)信息中依次獲取標(biāo)識(shí),輸出在特定目標(biāo)數(shù)據(jù)庫(kù)中執(zhí)行的SQL語(yǔ) 句,所述步驟可以包括如下過(guò)程獲取語(yǔ)句類(lèi)型,并輸出相應(yīng)信息至緩沖區(qū);獲取語(yǔ)法樹(shù)中的列信息,并輸出相應(yīng)信息至緩沖區(qū);
獲取源表名稱(chēng),并輸出相應(yīng)信息至緩沖區(qū); 獲取別名,并輸出相應(yīng)信息至緩沖區(qū),如為空則不輸出; 獲取選擇記錄數(shù)信息,并輸出相應(yīng)信息至緩沖區(qū); 輸出緩沖區(qū)的內(nèi)容。下面以查詢(xún)某個(gè)表的前N條數(shù)據(jù)的具體實(shí)例對(duì)以上步驟及原理進(jìn)行詳細(xì) 介紹KSQL規(guī)定查詢(xún)某個(gè)表的前N條數(shù)據(jù)的語(yǔ)法如下SELECT [TOPn] {* |列名} [,{*|列名}[,{*|列名}[...]]] FROM表名[AS 別名]忽略大小寫(xiě),其中n為大于0的整數(shù);{A|B}表示在A和B中二選一;[A]表示A是可選的。根據(jù)這一語(yǔ)法規(guī)則,外部JAVA程序在DB2數(shù)據(jù)庫(kù)中執(zhí)行"SELECT TOP 100 * FROMt"的步驟如下1、 當(dāng)接收到外部JAVA程序發(fā)送的KSQL語(yǔ)句"SELECT TOP 100 * FROMt"時(shí),將該語(yǔ)句根據(jù)語(yǔ)法解析成一棵語(yǔ)法樹(shù),并檢查語(yǔ)句是否符合語(yǔ)法。 如果不合法則異常退出。解析后的語(yǔ)法樹(shù)信息結(jié)構(gòu)如下語(yǔ)句類(lèi)型SELECT 選擇列表* 源表名稱(chēng)t 別名選擇記錄數(shù)1002、 從語(yǔ)句的語(yǔ)法樹(shù)信息中依次獲取標(biāo)識(shí),并翻譯成相應(yīng)的SQL語(yǔ)句。上 面的語(yǔ)句將通過(guò)以下幾個(gè)步驟完成翻譯(1) 獲取語(yǔ)句類(lèi)型,"SELECT"說(shuō)明這是一個(gè)選擇功能的語(yǔ)句,則輸出 "SELECT"到緩沖區(qū),緩沖區(qū)的內(nèi)容為"SELECT";(2) 獲取樹(shù)中的列信息,發(fā)現(xiàn)僅有一項(xiàng)*,則輸出"*"到緩沖區(qū),如有多 項(xiàng)則循環(huán),緩沖區(qū)的內(nèi)容為"SELECT*";
(3) 獲取源表名稱(chēng),"t"直接加上"FROM"作為前綴后輸出到緩沖區(qū),緩 沖區(qū)內(nèi)容為"SELECT * FROM t";(4) 獲取別名,發(fā)現(xiàn)為空,則不輸出任何東西,緩沖區(qū)內(nèi)容為"SELECT* FROMt";(5) 獲取選擇記錄數(shù)信息,100表示有僅選擇前100條記錄,則向緩沖 區(qū)輸出"FETCH FIRST 100 ROWS ONLY",緩沖區(qū)的內(nèi)容為"SELECT * FROM t FETCH FIRST 100 ROWS ONLY"。3、翻譯完成,將緩沖區(qū)的內(nèi)容"SELECT * FROM t FETCH FIRST 100 ROWS ONLY"發(fā)到目標(biāo)數(shù)據(jù)庫(kù)執(zhí)行。從上述實(shí)例可以得知,翻譯的整個(gè)過(guò)程為(1 )規(guī)定語(yǔ)法(2)對(duì)接收的 語(yǔ)句進(jìn)行語(yǔ)法解析并檢查(3 )根據(jù)語(yǔ)法解析的結(jié)果進(jìn)行輸出。參照?qǐng)D3,示出了本發(fā)明第二實(shí)施例一種訪問(wèn)不同類(lèi)型數(shù)據(jù)庫(kù)方法的流程 圖,包括步驟步驟301、接收與目標(biāo)數(shù)據(jù)庫(kù)無(wú)關(guān)的通用SQL語(yǔ)句。本發(fā)明在不同數(shù)據(jù)庫(kù)支持不同SQL語(yǔ)法的基礎(chǔ)上提出一種通用的SQL語(yǔ) 句,即KSQL語(yǔ)句。所述通用的SQL語(yǔ)句有自身的語(yǔ)法,所述語(yǔ)法可以方侵_ 地描述數(shù)據(jù)庫(kù)的各種功能,但它不能直接運(yùn)行在具體的目標(biāo)數(shù)據(jù)庫(kù)中。因此, 使用所述通用SQL語(yǔ)句可以使外部應(yīng)用程序不再關(guān)心所運(yùn)行的數(shù)據(jù)庫(kù)環(huán)境, 提高了應(yīng)用的靈活性。步驟302、判斷目標(biāo)數(shù)據(jù)庫(kù)類(lèi)型。獲得應(yīng)用系統(tǒng)所運(yùn)行的數(shù)據(jù)庫(kù)環(huán)境信息,即目標(biāo)數(shù)據(jù)庫(kù)類(lèi)型,所述數(shù)據(jù)庫(kù) 環(huán)境信息保存在配置文件中,在創(chuàng)建數(shù)據(jù)庫(kù)連接時(shí)獲取。步驟303、判斷目標(biāo)數(shù)據(jù)庫(kù)是否支持所述通用SQL語(yǔ)句的功能。如果支 持,則根據(jù)目標(biāo)數(shù)據(jù)庫(kù)類(lèi)型將通用SQL語(yǔ)句翻譯成在特定目標(biāo)數(shù)據(jù)庫(kù)中執(zhí)行 的SQL語(yǔ)句,即本發(fā)明第一實(shí)例所述情況,在些不再詳細(xì)描述。如果不支持則進(jìn)入步驟304。步驟304、在目標(biāo)數(shù)據(jù)庫(kù)中預(yù)置實(shí)現(xiàn)所述通用SQL語(yǔ)句功能的存儲(chǔ)過(guò)程。 進(jìn)入步驟305。步驟305、將所述通用SQL語(yǔ)句翻譯成所述存儲(chǔ)過(guò)程的調(diào)用語(yǔ)句。 存在這樣一種情況,KSQL的某些功能在特定目標(biāo)數(shù)據(jù)庫(kù)中不能通過(guò)普通 的SQL語(yǔ)句實(shí)現(xiàn)。如增加一列的SQL語(yǔ)句,在SQL SERVER中可以通過(guò) ALTER TABLE t ADD fl VARCHAR (50)實(shí)現(xiàn),但在DB2中卻沒(méi)有直接的語(yǔ) 法支持,但它可以通過(guò)多條SQL語(yǔ)句來(lái)變通實(shí)現(xiàn),為了屏蔽這種差異,可以 先預(yù)置一個(gè)在DB2數(shù)據(jù)庫(kù)上可以實(shí)現(xiàn)該功能的存儲(chǔ)過(guò)程,并在翻譯時(shí)將語(yǔ)句 翻譯成該存儲(chǔ)過(guò)程的調(diào)用語(yǔ)句,所述存儲(chǔ)過(guò)程的邏輯為創(chuàng)建一個(gè)新表,該新 表的列為原表列加上待增加的列,然后將原表的數(shù)據(jù)復(fù)制到新表中,并將原表 刪除。所述邏輯代碼在此不予介紹。在系統(tǒng)布署時(shí)先在目標(biāo)數(shù)據(jù)庫(kù)如DB2數(shù) 據(jù)庫(kù)中執(zhí)行該存儲(chǔ)過(guò)程。在數(shù)據(jù)庫(kù)中新增該存儲(chǔ)過(guò)程后,就可以支持所述功能 了,假如該存儲(chǔ)過(guò)程的名稱(chēng)是add—column,應(yīng)用系統(tǒng)請(qǐng)求的KSQL語(yǔ)句與在 不同的目標(biāo)數(shù)據(jù)庫(kù)上執(zhí)行的語(yǔ)句如下KSQL: ALTER TABLE t ADD fl VARCHAR (50);DB2: CALL add一column('t', 'fl', 'VARCHAR (50)');ORACLE: ALTER TABLE t ADD (fl VARCHAR2 (50》;SQL SERVER: ALTER TABLE t ADD fl VARCHAR (50)。步驟306、目標(biāo)數(shù)據(jù)庫(kù)執(zhí)行操作,返回執(zhí)行結(jié)果。本實(shí)施例所述技術(shù)方案通過(guò)預(yù)置存儲(chǔ)過(guò)程結(jié)合翻譯,最大程度的屏蔽各種 數(shù)據(jù)庫(kù)之間的差異,從而所有的SQL功能都可以在不同的數(shù)據(jù)庫(kù)中實(shí)現(xiàn)。參照?qǐng)D4,示出了本發(fā)明第三實(shí)施例一種訪問(wèn)不同類(lèi)型數(shù)據(jù)庫(kù)方法的流程 圖,包括步驟步驟401、接收與目標(biāo)數(shù)據(jù)庫(kù)無(wú)關(guān)的通用SQL語(yǔ)句。本發(fā)明在不同數(shù)據(jù)庫(kù)支持不同SQL語(yǔ)法的基礎(chǔ)上提出一種通用的SQL語(yǔ) 句,即KSQL語(yǔ)句。所述通用的SQL語(yǔ)句有自身的語(yǔ)法,所述語(yǔ)法可以方^f更 地描述數(shù)據(jù)庫(kù)的各種功能,但它不能直接運(yùn)行在具體的目標(biāo)數(shù)據(jù)庫(kù)中。因此, 使用所述通用SQL語(yǔ)句可以使外部應(yīng)用程序不再關(guān)心所運(yùn)行的數(shù)據(jù)庫(kù)環(huán)境, 提高了應(yīng)用的靈活性。步驟402、判斷所述通用SQL語(yǔ)句是否以嚴(yán)dialect"為前綴。如果所述通用SQL語(yǔ)句不是以嚴(yán)dialec,/為前綴,則進(jìn)入步驟判斷目標(biāo) 數(shù)據(jù)庫(kù)類(lèi)型;根據(jù)目標(biāo)數(shù)據(jù)庫(kù)類(lèi)型將通用SQL語(yǔ)句翻譯成在特定目標(biāo)數(shù)據(jù)庫(kù)
中執(zhí)行的SQL語(yǔ)句;發(fā)送所述翻譯的SQL語(yǔ)句至特定目標(biāo)數(shù)據(jù)庫(kù)。即本發(fā)明 第一實(shí)施例的情況,在些不再予以詳述。 — 如果所述通用SQL語(yǔ)句是以嚴(yán)dialect"為前綴,則進(jìn)入步驟403。 步驟403、直接發(fā)送所述SQL語(yǔ)句至特定目標(biāo)數(shù)據(jù)庫(kù)。 當(dāng)發(fā)現(xiàn)語(yǔ)句是以嚴(yán)dialect"開(kāi)始時(shí),表明該語(yǔ)句不需要翻譯,直接作為最 終的SQL語(yǔ)句輸出。在所有的SQL語(yǔ)法當(dāng)中,/*和*/之間包含的內(nèi)容被當(dāng) 作注釋?zhuān)粫?huì)被處理,所以嚴(yán)dialect"的存在不會(huì)影響最終SQL語(yǔ)句的執(zhí)行。 本實(shí)施例所述技術(shù)方案使用語(yǔ)句前綴的方式?jīng)Q定是否要對(duì)語(yǔ)句進(jìn)行翻譯, ^v而避免了對(duì)外發(fā)布多個(gè)不同的接口 。參照?qǐng)D5、示出了本發(fā)明第一實(shí)施例一種訪問(wèn)不同類(lèi)型凄丈據(jù)庫(kù)系統(tǒng)的結(jié)構(gòu) 框圖,包括接收單元501、用于接收與目標(biāo)數(shù)據(jù)庫(kù)無(wú)關(guān)的通用SQL語(yǔ)句。 本發(fā)明在不同數(shù)據(jù)庫(kù)支持不同SQL語(yǔ)法的基礎(chǔ)上提出一種通用的SQL語(yǔ) 句,即KSQL語(yǔ)句。所述通用的SQL語(yǔ)句有自身的語(yǔ)法,所述語(yǔ)法可以方侵_ 地描述數(shù)據(jù)庫(kù)的各種功能,但它不能直接運(yùn)行在具體的目標(biāo)數(shù)據(jù)庫(kù)中。因此, 使用所述通用SQL語(yǔ)句可以使外部應(yīng)用程序不再關(guān)心所運(yùn)行的數(shù)據(jù)庫(kù)環(huán)境, 提高了應(yīng)用的靈活性。第一判斷單元502、用于判斷目標(biāo)數(shù)據(jù)庫(kù)類(lèi)型。獲得應(yīng)用系統(tǒng)所運(yùn)行的數(shù)據(jù)庫(kù)環(huán)境信息,即目標(biāo)數(shù)據(jù)庫(kù)類(lèi)型,所述數(shù)據(jù)庫(kù) 環(huán)境信息保存在配置文件中,在創(chuàng)建數(shù)據(jù)庫(kù)連接時(shí)獲取。因?yàn)镵SQL語(yǔ)句是不 能在具體的數(shù)據(jù)庫(kù)中執(zhí)行的,所以在將KSQL語(yǔ)句翻譯成適合在特定目標(biāo)數(shù)據(jù) 庫(kù)執(zhí)行的SQL語(yǔ)句之前,必須先判斷其所要運(yùn)行的數(shù)據(jù)庫(kù)類(lèi)型,從而翻譯成 相應(yīng)類(lèi)型的SQL語(yǔ)句。翻譯單元503、用于將通用SQL語(yǔ)句翻譯成在特定目標(biāo)數(shù)據(jù)庫(kù)中執(zhí)行的 SQL語(yǔ)句。所述翻譯單元包括預(yù)置單元5031、用于預(yù)置相應(yīng)語(yǔ)法;語(yǔ)法樹(shù)解析單元5032、用于根據(jù)語(yǔ)法將通用SQL語(yǔ)句解析成語(yǔ)法樹(shù); 輸出單元5033、用于從語(yǔ)法樹(shù)信息中依次獲取標(biāo)識(shí),輸出在特定目標(biāo)數(shù) 據(jù)庫(kù)中執(zhí)行的SQL語(yǔ)句。在確定目標(biāo)數(shù)據(jù)庫(kù)類(lèi)型后,將不能在具體數(shù)據(jù)庫(kù)中執(zhí)行的KSQL語(yǔ)句翻譯 成能夠在特定目標(biāo)數(shù)據(jù)庫(kù)的執(zhí)行的SQL語(yǔ)句。所述翻譯過(guò)程及原理將在前面 已經(jīng)進(jìn)行了詳細(xì)的描述,為了節(jié)約篇幅,在此不再詳述。發(fā)送單元504、用于發(fā)送所述翻譯的SQL語(yǔ)句至特定目標(biāo)數(shù)據(jù)庫(kù)。翻譯完成后,將所述翻譯完成的適合在特定目標(biāo)數(shù)據(jù)庫(kù)執(zhí)行的SQL語(yǔ)句 發(fā)送至目標(biāo)數(shù)據(jù)庫(kù)。進(jìn)一步,還可以包括返回單元505、用于在目標(biāo)數(shù)據(jù)庫(kù)執(zhí)行SQL語(yǔ)句后, 返回執(zhí)行結(jié)果。參照?qǐng)D6、示出了本發(fā)明第二實(shí)施例一種訪問(wèn)不同類(lèi)型數(shù)據(jù)庫(kù)系統(tǒng)的結(jié)構(gòu) 框圖,包括接收單元601、用于接收與目標(biāo)數(shù)據(jù)庫(kù)無(wú)關(guān)的通用SQL語(yǔ)句。 本發(fā)明在不同數(shù)據(jù)庫(kù)支持不同SQL語(yǔ)法的基礎(chǔ)上提出一種通用的SQL語(yǔ) 句,即KSQL語(yǔ)句。所述通用的SQL語(yǔ)句有自身的語(yǔ)法,所述語(yǔ)法可以方便 地描述數(shù)據(jù)庫(kù)的各種功能,但它不能直接運(yùn)行在具體的目標(biāo)數(shù)據(jù)庫(kù)中。因此, 使用所述通用SQL語(yǔ)句可以使外部應(yīng)用程序不再關(guān)心所運(yùn)行的數(shù)據(jù)庫(kù)環(huán)境, 提高了應(yīng)用的靈活性。第一判斷單元602、用于判斷目標(biāo)數(shù)據(jù)庫(kù)類(lèi)型。獲得應(yīng)用系統(tǒng)所運(yùn)行的凄t據(jù)庫(kù)環(huán)境信息,即目標(biāo)數(shù)據(jù)庫(kù)類(lèi)型,所述數(shù)據(jù)庫(kù) 環(huán)境信息保存在配置文件中,在創(chuàng)建數(shù)據(jù)庫(kù)連接時(shí)獲取。第二判斷單元603、用于判斷目標(biāo)數(shù)據(jù)庫(kù)是否支持通用SQL語(yǔ)句的功能。 如果所述目標(biāo)數(shù)據(jù)庫(kù)不支持通用SQL語(yǔ)句的功能,貝'J:翻譯單元604、用于將所述通用SQL語(yǔ)句翻譯成所述存儲(chǔ)過(guò)程的調(diào)用語(yǔ)句發(fā)送單元605、用于發(fā)送所述翻譯的SQL語(yǔ)句至特定目標(biāo)凄t據(jù)庫(kù)。 參照?qǐng)D7、示出了本發(fā)明第三實(shí)施例一種訪問(wèn)不同類(lèi)型凝:據(jù)庫(kù)系統(tǒng)的結(jié)構(gòu) 框圖,包括接收單元701 、用于接收與目標(biāo)數(shù)據(jù)庫(kù)無(wú)關(guān)的通用SQL語(yǔ)句。 本發(fā)明在不同數(shù)據(jù)庫(kù)支持不同SQL語(yǔ)法的基礎(chǔ)上提出一種通用的SQL語(yǔ) 句,即KSQL語(yǔ)句。所述通用的SQL語(yǔ)句有自身的語(yǔ)法,所述語(yǔ)法可以方i^更 地描述數(shù)據(jù)庫(kù)的各種功能,但它不能直接運(yùn)行在具體的目標(biāo)數(shù)據(jù)庫(kù)中。因此, 使用所述通用SQL語(yǔ)句可以使外部應(yīng)用程序不再關(guān)心所運(yùn)行的數(shù)據(jù)庫(kù)環(huán)境, 提高了應(yīng)用的靈活性。第三判斷單元702、用于判斷通用SQL語(yǔ)句是否以嚴(yán)dialect〃為前綴。 如果所述通用SQL語(yǔ)句以嚴(yán)dialect"為前綴,貝'J: 發(fā)送單元703、用于直接發(fā)送所述SQL語(yǔ)句至目標(biāo)數(shù)據(jù)庫(kù)。 圖5、圖6、圖7是與圖1、圖3、圖4所述方法實(shí)施例對(duì)應(yīng)的裝置實(shí)施例, 因此,裝置實(shí)施例中未詳細(xì)描述的部分參照方法實(shí)施例中的相關(guān)部分即可。 以上對(duì)本發(fā)明所提供的 一種訪問(wèn)不同類(lèi)型數(shù)據(jù)庫(kù)的方法和系統(tǒng),進(jìn)行了詳實(shí)施例的說(shuō)明只是用于幫助理解本發(fā)明的方法及其核心思想;同時(shí),對(duì)于本領(lǐng) 域的一般技術(shù)人員,依據(jù)本發(fā)明的思想,在具體實(shí)施方式
及應(yīng)用范圍上均會(huì)有 改變之處,綜上所述,本說(shuō)明書(shū)內(nèi)容不應(yīng)理解為對(duì)本發(fā)明的限制。
權(quán)利要求
1、一種訪問(wèn)不同類(lèi)型數(shù)據(jù)庫(kù)的方法,其特征在于,包括接收與目標(biāo)數(shù)據(jù)庫(kù)無(wú)關(guān)的通用SQL語(yǔ)句;判斷目標(biāo)數(shù)據(jù)庫(kù)類(lèi)型;根據(jù)目標(biāo)數(shù)據(jù)庫(kù)類(lèi)型將通用SQL語(yǔ)句翻譯成在特定目標(biāo)數(shù)據(jù)庫(kù)中執(zhí)行的SQL語(yǔ)句;發(fā)送所述翻譯的SQL語(yǔ)句至特定目標(biāo)數(shù)據(jù)庫(kù)。
2、 如權(quán)利要求1所述的訪問(wèn)不同類(lèi)型數(shù)據(jù)庫(kù)的方法,其特征在于,還包 括步驟目標(biāo)數(shù)據(jù)庫(kù)執(zhí)行所述SQL語(yǔ)句,返回執(zhí)行結(jié)果。
3、 如權(quán)利要求1所述的訪問(wèn)不同類(lèi)型數(shù)據(jù)庫(kù)的方法,其特征在于,在所 述翻譯步驟前還包括步驟判斷目標(biāo)數(shù)據(jù)庫(kù)是否支持所述通用SQL語(yǔ)句的功能,如不支持則 在目標(biāo)數(shù)據(jù)庫(kù)中預(yù)置實(shí)現(xiàn)所述通用SQL語(yǔ)句功能的存儲(chǔ)過(guò)程; 所述翻譯過(guò)程為將所述通用SQL語(yǔ)句翻譯成所述存儲(chǔ)過(guò)程的調(diào)用語(yǔ)句。
4、 如權(quán)利要求1所述的訪問(wèn)不同類(lèi)型數(shù)據(jù)庫(kù)的方法,其特征在于,所述 翻譯過(guò)程包括步驟預(yù)置相應(yīng)語(yǔ)法;對(duì)接收的通用SQL語(yǔ)句進(jìn)行語(yǔ)法解析;根據(jù)語(yǔ)法解析的結(jié)果輸出在特定目標(biāo)數(shù)據(jù)庫(kù)中執(zhí)行的SQL語(yǔ)句。
5、 如權(quán)利要求4所述的訪問(wèn)不同類(lèi)型數(shù)據(jù)庫(kù)的方法,其特征在于,所述 語(yǔ)法解析具體步驟為根據(jù)語(yǔ)法將通用SQL語(yǔ)句解析成語(yǔ)法樹(shù);所述輸出在特定目標(biāo)數(shù)據(jù)庫(kù)中執(zhí)行的SQL語(yǔ)句的具體步驟為從語(yǔ)法樹(shù)信息中依次獲取標(biāo)識(shí),輸出在特定目標(biāo)數(shù)據(jù)庫(kù)中執(zhí)行的SQL語(yǔ)句。
6、 如權(quán)利要求1所述的訪問(wèn)不同類(lèi)型數(shù)據(jù)庫(kù)的方法,其特征在于,在所 述接收通用SQL語(yǔ)句步驟后還包括判斷所述通用SQL語(yǔ)句是否以嚴(yán)dialect"為前綴,否則進(jìn)入下一步,是貝'J: 直接發(fā)送所述SQL譯句至特定目標(biāo)數(shù)據(jù)庫(kù)。
7、 一種訪問(wèn)不同類(lèi)型數(shù)據(jù)庫(kù)的系統(tǒng),其特征在于,包括 接收單元,用于接收與目標(biāo)數(shù)據(jù)庫(kù)無(wú)關(guān)的通用SQL語(yǔ)句; 第一判斷單元,用于判斷目標(biāo)數(shù)據(jù)庫(kù)類(lèi)型;翻譯單元,用于將通用SQL語(yǔ)句翻譯成在特定目標(biāo)數(shù)據(jù)庫(kù)中執(zhí)行的SQL 語(yǔ)句;發(fā)送單元,用于發(fā)送所述翻譯的SQL語(yǔ)句至特定目標(biāo)數(shù)據(jù)庫(kù)。
8、 如權(quán)利要求7所述的訪問(wèn)不同類(lèi)型數(shù)據(jù)庫(kù)的系統(tǒng),其特征在于,還包括返回單元,用于在目標(biāo)數(shù)據(jù)庫(kù)執(zhí)行SQL語(yǔ)句后,返回執(zhí)行結(jié)果。
9、 如權(quán)利要求7所述的訪問(wèn)不同類(lèi)型數(shù)據(jù)庫(kù)的系統(tǒng),其特征在于,還包括第二判斷單元,用于判斷目標(biāo)數(shù)據(jù)庫(kù)是否支持通用SQL語(yǔ)句的功能。
10、 如權(quán)利要求7所述的訪問(wèn)不同類(lèi)型數(shù)據(jù)庫(kù)的系統(tǒng),其特征在于,所述 翻譯單元包括預(yù)置單元,用于預(yù)置相應(yīng)語(yǔ)法;語(yǔ)法樹(shù)解析單元,用于根據(jù)語(yǔ)法將通用SQL語(yǔ)句解析成語(yǔ)法樹(shù); 輸出單元,用于從語(yǔ)法樹(shù)信息中依次獲取標(biāo)識(shí),輸出在特定目標(biāo)數(shù)據(jù)庫(kù)中 執(zhí)行的SQL語(yǔ)句。
11、 如權(quán)利要求7所述的訪問(wèn)不同類(lèi)型數(shù)據(jù)庫(kù)的系統(tǒng),其特征在于,還包括第三判斷單元,用于判斷通用SQL語(yǔ)句是否以嚴(yán)dialec"/為前綴。
全文摘要
本發(fā)明提供了一種訪問(wèn)不同類(lèi)型數(shù)據(jù)庫(kù)的方法,包括步驟接收與目標(biāo)數(shù)據(jù)庫(kù)無(wú)關(guān)的通用SQL語(yǔ)句;判斷目標(biāo)數(shù)據(jù)庫(kù)類(lèi)型;根據(jù)目標(biāo)數(shù)據(jù)庫(kù)類(lèi)型將通用SQL語(yǔ)句翻譯成在特定目標(biāo)數(shù)據(jù)庫(kù)中執(zhí)行的SQL語(yǔ)句;發(fā)送所述翻譯的SQL語(yǔ)句至特定目標(biāo)數(shù)據(jù)庫(kù)。通過(guò)所述方法可以屏蔽不同數(shù)據(jù)庫(kù)的差異,應(yīng)用程序不需要關(guān)心所運(yùn)行的目標(biāo)數(shù)據(jù)庫(kù)類(lèi)型。本發(fā)明還提供了一種訪問(wèn)不同類(lèi)型數(shù)據(jù)庫(kù)的系統(tǒng)。
文檔編號(hào)G06F17/30GK101158975SQ200710187680
公開(kāi)日2008年4月9日 申請(qǐng)日期2007年11月21日 優(yōu)先權(quán)日2007年11月21日
發(fā)明者潘國(guó)林 申請(qǐng)人:金蝶軟件(中國(guó))有限公司