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