欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

Sql函數(shù)轉(zhuǎn)換裝置和sql函數(shù)轉(zhuǎn)換方法

文檔序號:6434506閱讀:339來源:國知局
專利名稱:Sql函數(shù)轉(zhuǎn)換裝置和sql函數(shù)轉(zhuǎn)換方法
技術(shù)領(lǐng)域
本發(fā)明涉及數(shù)據(jù)庫技術(shù)領(lǐng)域,具體而言,涉及SQL函數(shù)轉(zhuǎn)換裝置和方法。
背景技術(shù)
隨著數(shù)據(jù)庫產(chǎn)品的不斷增多,除流行的0RACLE、Sql Server、DB2外,目前國內(nèi)又涌現(xiàn)出了諸如KingbaseES、GBASE、OSCAR等比較成熟的數(shù)據(jù)庫產(chǎn)品,用戶基與各種需求對數(shù)據(jù)庫的選擇也在增加。作為一款產(chǎn)品化的軟件讓其支持多種數(shù)據(jù)庫技術(shù)是很有必要的。如何讓軟件產(chǎn)品能與不同的數(shù)據(jù)庫產(chǎn)品交互,面對數(shù)十萬行的產(chǎn)品代碼,不可能針對每種數(shù)據(jù)庫對上層代碼進(jìn)行修改,目前比較流行的做法是盡量使用與數(shù)據(jù)庫無關(guān)的通用SQL語句和數(shù)據(jù)類型;重寫與開發(fā)工具相關(guān)的DataBase對象;在DataBase對象的底層截取SQL串進(jìn)行與目標(biāo)數(shù)據(jù)庫相關(guān)的替換。其中最重要的工作之一就是對SQL串的替換,SQL串的替換一般有以下幾種形式1、直接在上層使用處更改SQL語句,目的是讓SQL語句變成通用寫法以減少 Database對象的底層替換操作。2、在Database對象的底層,對于替換條件滿足唯一正側(cè)表達(dá)式的串使用正側(cè)表達(dá)式進(jìn)行替換。3、對于滿足有限替換條件,且條件之間不會產(chǎn)生互拆的串使用正側(cè)表達(dá)式方式進(jìn)行順序替換。不同數(shù)據(jù)庫產(chǎn)品之間的主要差異之一就是數(shù)據(jù)庫的系統(tǒng)函數(shù)差異,如以下列舉的一些類型的差異1、功能相同但名稱不同,如Sql Server中的Len(string_expression)函數(shù)與 KingbaseES 中的 Length (string_expression)函數(shù)。2、名稱相同但功能不同,如Sql Server中的CONVERT函數(shù)與KingbaseES中的 CONVERT函數(shù)是兩個完全無法聯(lián)系在一起的函數(shù),前者是用作數(shù)據(jù)類型的轉(zhuǎn)換,后者是用作字符串編碼的轉(zhuǎn)換。3、入口參數(shù)有差異,如 Sql Server 中的 SPACE(integer_expression)與 KingbaseES 中的 RPAD (char_expression, integer_expression)。4、某一數(shù)據(jù)庫中獨有的函數(shù),如 Sql Server 中的 IIf (《Logical Expression)), ((Numeric Expressionl)), ((Numeric Expression2))),在 KingbaseES 中不存在。對于支持多數(shù)據(jù)庫的軟件產(chǎn)品,這些差異處理不好會造成錯誤,如直接報錯、由于引用處使用了容錯而使代碼往錯誤的邏輯方向運行、返回不是需要的結(jié)果等,對開發(fā)和測試帶來很大的額外工作量。而對SQL串的替換操作不能簡單用正側(cè)表達(dá)式方式替換,主要有以下三方面原因1、因為函數(shù)的使用往往帶有復(fù)雜的混合、嵌套使用的問題,因而造成無法用正側(cè)表達(dá)式表述,例如 Sql server 表述select space (12-len(' 2311'))在 KingbaseES 中的等效轉(zhuǎn)換select RPAD(' ‘,12_length(' 2311'))。2、函數(shù)入口參數(shù)的多樣性造成匹配的正側(cè)表達(dá)式的多樣性。例如Sql server中 conver函數(shù)至少對應(yīng)20種以上的轉(zhuǎn)換形式。3、由于數(shù)據(jù)庫系統(tǒng)間的差異,無直接匹配的功能函數(shù),還需要通過特定算生成相應(yīng)的替換串,如Sql server表述select convert (varchar (10), cast( ‘ 2011-01-1209:30:01 ‘ as datetime),102),在 KingbaseES 中的等效轉(zhuǎn)轉(zhuǎn)為 select T0_CHAR(cast(' 2011-01-1209:30:01' as TIMESTAMP), ‘ YYYY.MM.DD')。因此,需要一種比較全面且安全可靠的函數(shù)替換技術(shù),可以考慮到不同數(shù)據(jù)庫產(chǎn)品之間的差異,滿足多種數(shù)據(jù)庫的要求。

發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問題在于,提供一種SQL函數(shù)轉(zhuǎn)換技術(shù),可以進(jìn)行全面且安全可靠的函數(shù)替換。根據(jù)本發(fā)明的一個方面,提供了一種SQL函數(shù)轉(zhuǎn)換裝置,包括第一替換單元,用標(biāo)識符替換來自調(diào)用者的SQL函數(shù)中的參數(shù),得到迭代后的SQL函數(shù);數(shù)據(jù)庫單元,將所述標(biāo)識符與所述參數(shù)對應(yīng)保存為參數(shù)對照表;處理單元,根據(jù)所述迭代后的SQL函數(shù)中的標(biāo)識符,從所述參數(shù)對照表提取出所述參數(shù),對所述參數(shù)進(jìn)行轉(zhuǎn)換處理;第二替換單元,將處理后的所述參數(shù)替換所述迭代后的SQL函數(shù)中對應(yīng)的標(biāo)識符,以得到目標(biāo)數(shù)據(jù)庫執(zhí)行的 SQL函數(shù)。在上述技術(shù)方案中,優(yōu)選地,所述第一替換單元用第一標(biāo)識符替換所述SQL函數(shù)中的單引號中的用戶值,用第二標(biāo)識符替換所述SQL函數(shù)中的小括號中的函數(shù)參數(shù),所述迭代后的SQL函數(shù)包含所述第一標(biāo)識符和所述第二標(biāo)識符。在上述技術(shù)方案中,優(yōu)選地,所述數(shù)據(jù)庫單元將所述第一標(biāo)識符與所述用戶值對應(yīng)保存為第一參數(shù)對照表,將所述第二標(biāo)識符與所述函數(shù)參數(shù)對應(yīng)保存為第二參數(shù)對照表,并在所述第二參數(shù)對照表中保存所述函數(shù)參數(shù)在所述SQL函數(shù)中的層級。在上述技術(shù)方案中,優(yōu)選地,所述第二替換單元根據(jù)所述迭代后的SQL函數(shù)中的所述第一標(biāo)識符和所述第一參數(shù)對照表提取出對應(yīng)的用戶值,將提取出的所述用戶值替換所述迭代后的SQL函數(shù)中對應(yīng)的所述第一標(biāo)識符;所述處理單元還包括分解單元和編寫單元,所述分解單元根據(jù)所述迭代后的SQL函數(shù)中的所述第二標(biāo)識符,從所述第二參數(shù)對照表提取出所述函數(shù)參數(shù),分解提取出的所述函數(shù)參數(shù),所述編寫單元按照目標(biāo)數(shù)據(jù)庫執(zhí)行的SQL函數(shù)規(guī)則重新編寫分解的所述函數(shù)參數(shù),所述第二替換單元將重新編寫后的函數(shù)參數(shù)替換所述迭代后的SQL函數(shù)中對應(yīng)的第二標(biāo)識符。在上述技術(shù)方案中,優(yōu)選地,所述第一替換單元采用遞歸算法將所述第二標(biāo)識符按照從低級到高級的順序分階替換所述SQL函數(shù)中的小括號中的函數(shù)參數(shù),所述第二替換單元按照從高級到低級的順序?qū)⑻幚砗蟮乃龊瘮?shù)參數(shù)替換所述迭代后的SQL函數(shù)中對應(yīng)的第二標(biāo)識符,以得到所述目標(biāo)數(shù)據(jù)庫執(zhí)行的SQL函數(shù)。通過上述技術(shù)方案,可以實現(xiàn)一種SQL函數(shù)轉(zhuǎn)換裝置,通過迭代技術(shù)和對應(yīng)的函數(shù)處理方法來實現(xiàn)SQL函數(shù)的轉(zhuǎn)換,將SQL函數(shù)轉(zhuǎn)換成目標(biāo)數(shù)據(jù)庫可以執(zhí)行的SQL函數(shù),并且轉(zhuǎn)換后的SQL函數(shù)全面且準(zhǔn)確,不會造成錯誤的結(jié)果。
根據(jù)本發(fā)明的又一方面,還提供了一種SQL函數(shù)轉(zhuǎn)換方法,包括步驟202,用標(biāo)識符替換來自調(diào)用者的SQL函數(shù)中的參數(shù),得到迭代后的SQL函數(shù);步驟204,將所述標(biāo)識符與所述參數(shù)對應(yīng)保存為參數(shù)對照表;步驟206,根據(jù)所述迭代后的SQL函數(shù)中的標(biāo)識符,從所述參數(shù)對照表提取出所述參數(shù),對所述參數(shù)進(jìn)行轉(zhuǎn)換處理,將處理后的所述參數(shù)替換所述迭代后的SQL函數(shù)中對應(yīng)的標(biāo)識符,以得到目標(biāo)數(shù)據(jù)庫執(zhí)行的SQL函數(shù)。在上述技術(shù)方案中,優(yōu)選地,所述步驟202具體可以包括所述參數(shù)包括用戶值和函數(shù)參數(shù),用第一標(biāo)識符替換所述SQL函數(shù)中的單引號中的所述用戶值,用第二標(biāo)識符替換所述SQL函數(shù)中的小括號中的所述函數(shù)參數(shù),所述迭代后的SQL函數(shù)包含所述第一標(biāo)識符和所述第二標(biāo)識符。在上述技術(shù)方案中,優(yōu)選地,所述步驟204具體可以包括將所述第一標(biāo)識符與所述用戶值對應(yīng)保存為第一參數(shù)對照表,將所述第二標(biāo)識符與所述函數(shù)參數(shù)對應(yīng)保存為第二參數(shù)對照表,并在所述第二參數(shù)對照表中保存所述函數(shù)參數(shù)在所述SQL函數(shù)中的層級。在上述技術(shù)方案中,優(yōu)選地,所述步驟206具體可以包括步驟2062,根據(jù)所述迭代后的SQL函數(shù)中的所述第二標(biāo)識符,從所述第二參數(shù)對照表提取出所述函數(shù)參數(shù),分解提取出的所述函數(shù)參數(shù),按照目標(biāo)數(shù)據(jù)庫執(zhí)行的SQL函數(shù)規(guī)則重新編寫分解的所述函數(shù)參數(shù),將重新編寫后的函數(shù)參數(shù)替換所述迭代后的SQL函數(shù)中對應(yīng)的第二標(biāo)識符;步驟2064, 根據(jù)所述迭代后的SQL函數(shù)中的所述第一標(biāo)識符和所述第一參數(shù)對照表提取出對應(yīng)的用戶值,將提取出的所述用戶值替換所述迭代后的SQL函數(shù)中對應(yīng)的所述第一標(biāo)識符。在上述技術(shù)方案中,優(yōu)選地,采用遞歸算法將所述第二標(biāo)識符按照從低級到高級的順序分階替換所述SQL函數(shù)中的小括號中的函數(shù)參數(shù),在得到所述目標(biāo)數(shù)據(jù)庫執(zhí)行的 SQL函數(shù)時,按照從高級到低級的順序?qū)⑻幚砗蟮乃龊瘮?shù)參數(shù)替換所述迭代后的SQL函數(shù)中對應(yīng)的第二標(biāo)識符。通過上述技術(shù)方案,可以實現(xiàn)一種SQL函數(shù)轉(zhuǎn)換方法,通過迭代技術(shù)和對應(yīng)的函數(shù)處理方法來實現(xiàn)SQL函數(shù)的轉(zhuǎn)換,將SQL函數(shù)轉(zhuǎn)換成目標(biāo)數(shù)據(jù)庫可以執(zhí)行的SQL函數(shù),并且轉(zhuǎn)換后的SQL函數(shù)全面且準(zhǔn)確,不會造成錯誤的結(jié)果。


圖1示出了根據(jù)本發(fā)明的實施例的SQL函數(shù)轉(zhuǎn)換裝置的框圖;圖2示出了根據(jù)本發(fā)明的實施例的SQL函數(shù)轉(zhuǎn)換方法的流程圖;以及圖3示出了根據(jù)本發(fā)明的實施例的SQL函數(shù)轉(zhuǎn)換方法的流程圖。
具體實施例方式為了能夠更清楚地理解本發(fā)明的上述目的、特征和優(yōu)點,下面結(jié)合附圖和具體實施方式
對本發(fā)明進(jìn)行進(jìn)一步的詳細(xì)描述。在下面的描述中闡述了很多具體細(xì)節(jié)以便于充分理解本發(fā)明,但是,本發(fā)明還可以采用其他不同于在此描述的其他方式來實施,因此,本發(fā)明并不限于下面公開的具體實施例的限制。圖1示出了根據(jù)本發(fā)明的實施例的SQL函數(shù)轉(zhuǎn)換裝置的框圖。如圖1所示,根據(jù)本發(fā)明的實施例的SQL函數(shù)轉(zhuǎn)換裝置100包括第一替換單元102,用標(biāo)識符替換來自調(diào)用者的SQL函數(shù)中的參數(shù),得到迭代后的SQL函數(shù);數(shù)據(jù)庫單元 104,將所述標(biāo)識符與所述參數(shù)對應(yīng)保存為參數(shù)對照表;處理單元106,根據(jù)所述迭代后的 SQL函數(shù)中的標(biāo)識符,從所述參數(shù)對照表提取出所述參數(shù),對所述參數(shù)進(jìn)行轉(zhuǎn)換處理;第二替換單元108,將處理后的所述參數(shù)替換所述迭代后的SQL函數(shù)中對應(yīng)的標(biāo)識符,以得到目標(biāo)數(shù)據(jù)庫執(zhí)行的SQL函數(shù)。在上述技術(shù)方案中,優(yōu)選地,所述第一替換單元102用第一標(biāo)識符替換所述SQL函數(shù)中的單引號中的用戶值,用第二標(biāo)識符替換所述SQL函數(shù)中的小括號中的函數(shù)參數(shù),所述迭代后的SQL函數(shù)包含所述第一標(biāo)識符和所述第二標(biāo)識符。在上述技術(shù)方案中,優(yōu)選地,所述數(shù)據(jù)庫單元104將所述第一標(biāo)識符與所述用戶值對應(yīng)保存為第一參數(shù)對照表,將所述第二標(biāo)識符與所述函數(shù)參數(shù)對應(yīng)保存為第二參數(shù)對照表,并在所述第二參數(shù)對照表中保存所述函數(shù)參數(shù)在所述SQL函數(shù)中的層級。在上述技術(shù)方案中,優(yōu)選地,所述第二替換單元108根據(jù)所述迭代后的SQL函數(shù)中的所述第一標(biāo)識符和所述第一參數(shù)對照表提取出對應(yīng)的用戶值,將提取出的所述用戶值替換所述迭代后的SQL函數(shù)中對應(yīng)的所述第一標(biāo)識符;所述處理單元106還包括分解單元 1062和編寫單元1064,所述分解單元1062根據(jù)所述迭代后的SQL函數(shù)中的所述第二標(biāo)識符,從所述第二參數(shù)對照表提取出所述函數(shù)參數(shù),分解提取出的所述函數(shù)參數(shù),所述編寫單元1064按照目標(biāo)數(shù)據(jù)庫執(zhí)行的SQL函數(shù)規(guī)則重新編寫分解的所述函數(shù)參數(shù),所述第二替換單元108將重新編寫后的函數(shù)參數(shù)替換所述迭代后的SQL函數(shù)中對應(yīng)的第二標(biāo)識符。在上述技術(shù)方案中,優(yōu)選地,所述第一替換單元102采用遞歸算法將所述第二標(biāo)識符按照從低級到高級的順序分階替換所述SQL函數(shù)中的小括號中的函數(shù)參數(shù),所述第二替換單元108按照從高級到低級的順序?qū)⑻幚砗蟮乃龊瘮?shù)參數(shù)替換所述迭代后的SQL函數(shù)中對應(yīng)的第二標(biāo)識符,以得到所述目標(biāo)數(shù)據(jù)庫執(zhí)行的SQL函數(shù)。通過上述技術(shù)方案,可以實現(xiàn)一種SQL函數(shù)轉(zhuǎn)換裝置,通過迭代技術(shù)和對應(yīng)的函數(shù)處理方法來實現(xiàn)SQL函數(shù)的轉(zhuǎn)換,將SQL函數(shù)轉(zhuǎn)換成目標(biāo)數(shù)據(jù)庫可以執(zhí)行的SQL函數(shù),并且轉(zhuǎn)換后的SQL函數(shù)全面且準(zhǔn)確,不會造成錯誤的結(jié)果。圖2示出了根據(jù)本發(fā)明的實施例的SQL函數(shù)轉(zhuǎn)換方法的流程圖。如圖2所示,根據(jù)本發(fā)明的實施例的SQL函數(shù)轉(zhuǎn)換方法,包括步驟202,用標(biāo)識符替換來自調(diào)用者的SQL函數(shù)中的參數(shù),得到迭代后的SQL函數(shù);步驟204,將所述標(biāo)識符與所述參數(shù)對應(yīng)保存為參數(shù)對照表;步驟206,根據(jù)所述迭代后的SQL函數(shù)中的標(biāo)識符,從所述參數(shù)對照表提取出所述參數(shù),對所述參數(shù)進(jìn)行轉(zhuǎn)換處理,將處理后的所述參數(shù)替換所述迭代后的SQL函數(shù)中對應(yīng)的標(biāo)識符,以得到目標(biāo)數(shù)據(jù)庫執(zhí)行的SQL函數(shù)。在上述技術(shù)方案中,優(yōu)選地,所述步驟202具體可以包括所述參數(shù)包括用戶值和函數(shù)參數(shù),用第一標(biāo)識符替換所述SQL函數(shù)中的單引號中的所述用戶值,用第二標(biāo)識符替換所述SQL函數(shù)中的小括號中的所述函數(shù)參數(shù),所述迭代后的SQL函數(shù)包含所述第一標(biāo)識符和所述第二標(biāo)識符。在上述技術(shù)方案中,優(yōu)選地,所述步驟204具體可以包括將所述第一標(biāo)識符與所述用戶值對應(yīng)保存為第一參數(shù)對照表,將所述第二標(biāo)識符與所述函數(shù)參數(shù)對應(yīng)保存為第二參數(shù)對照表,并在所述第二參數(shù)對照表中保存所述函數(shù)參數(shù)在所述SQL函數(shù)中的層級。在上述技術(shù)方案中,優(yōu)選地,所述步驟206具體可以包括步驟2062,根據(jù)所述迭代后的SQL函數(shù)中的所述第二標(biāo)識符,從所述第二參數(shù)對照表提取出所述函數(shù)參數(shù),分解提取出的所述函數(shù)參數(shù),按照目標(biāo)數(shù)據(jù)庫執(zhí)行的SQL函數(shù)規(guī)則重新編寫分解的所述函數(shù)參數(shù),將重新編寫后的函數(shù)參數(shù)替換所述迭代后的SQL函數(shù)中對應(yīng)的第二標(biāo)識符;步驟2064, 根據(jù)所述迭代后的SQL函數(shù)中的所述第一標(biāo)識符和所述第一參數(shù)對照表提取出對應(yīng)的用戶值,將提取出的所述用戶值替換所述迭代后的SQL函數(shù)中對應(yīng)的所述第一標(biāo)識符。在上述技術(shù)方案中,優(yōu)選地,采用遞歸算法將所述第二標(biāo)識符按照從低級到高級的順序分階替換所述SQL函數(shù)中的小括號中的函數(shù)參數(shù),在得到所述目標(biāo)數(shù)據(jù)庫執(zhí)行的 SQL函數(shù)時,按照從高級到低級的順序?qū)⑻幚砗蟮乃龊瘮?shù)參數(shù)替換所述迭代后的SQL函數(shù)中對應(yīng)的第二標(biāo)識符。通過上述技術(shù)方案,可以實現(xiàn)一種SQL函數(shù)轉(zhuǎn)換方法,通過迭代技術(shù)和對應(yīng)的函數(shù)處理方法來實現(xiàn)SQL函數(shù)的轉(zhuǎn)換,將SQL函數(shù)轉(zhuǎn)換成目標(biāo)數(shù)據(jù)庫可以執(zhí)行的SQL函數(shù),并且轉(zhuǎn)換后的SQL函數(shù)全面且準(zhǔn)確,不會造成錯誤的結(jié)果。下面結(jié)合圖3進(jìn)一步說明根據(jù)本發(fā)明的技術(shù)方案。首先,用標(biāo)識替換SQL串中的函數(shù)描述部分按取最小單位原則,通過層層迭代SQL串中的()部分(指小括號內(nèi)的函數(shù)參數(shù)), 使SQL串中需要被轉(zhuǎn)換的函數(shù)描述部分具備了正側(cè)表達(dá)式描述-函數(shù)名(\s*{iW-9]*}) 的特性,例如將 convert (varchar,cast (‘ 2011-01-1209:30:01' as datetime),102) 迭代后變成 convert {§2},參數(shù)(varchar,cast (‘ 2011-01-1209:30:01, as datetime), 102)存放在參數(shù)對照表中序號為2的位置,2對應(yīng)的存入值為(varchar,cast{#l},102)。 {@序號}代表函數(shù)參數(shù),{#序號}代表用戶值。然后,將需要被轉(zhuǎn)換的函數(shù)描述轉(zhuǎn)換成目標(biāo)數(shù)據(jù)庫的調(diào)用從迭代后的Sql串和參數(shù)對照表中提取函數(shù)描述,例如函數(shù)描述函數(shù)名(參數(shù) 1,參數(shù)2),提取值應(yīng)該是函數(shù)名序號};根據(jù)序號提取對應(yīng)參數(shù)串(參數(shù)1,參數(shù)2); 分解參數(shù)串并調(diào)用對應(yīng)的轉(zhuǎn)換方法對分解的參數(shù)進(jìn)行轉(zhuǎn)換,將轉(zhuǎn)換后的結(jié)果存放到對照表中;再提取參數(shù)串中需要被轉(zhuǎn)換的函數(shù)描述進(jìn)入下一轉(zhuǎn)換,用戶值不需要轉(zhuǎn)換。最后,重建SQL串把對照表中的轉(zhuǎn)換值,按最大原則自頂向下逐步將轉(zhuǎn)換結(jié)果還原到被迭代的SQL串,得到能被目標(biāo)數(shù)據(jù)庫執(zhí)行的SQL串。下面參見圖3對上面描述的函數(shù)轉(zhuǎn)換過程進(jìn)行詳細(xì)描述。如圖3所示,在步驟302,從調(diào)用者接收SOL語句。在步驟304,為防止用戶值被誤替換,對截取的SQL串中的用戶值(主要是單引號中的用戶值),用第一標(biāo)識符替換SQL串中的用戶值,替換后的用戶值保存到數(shù)組QuotationMarks(第一參數(shù)對照表)中,且每個值對應(yīng)一個唯一標(biāo)示符,第一標(biāo)識符格式為{#序號},序號對應(yīng)用戶值在數(shù)組中的下標(biāo)。提取用戶值的正側(cè)表達(dá)式 V rv ]*V,相關(guān)算法實現(xiàn)描述如下Function ExtractQuotationMarks(sSql As String,Optional rowX As Long = 0)獲取所有符合ν Γ\' ]*\正側(cè)表達(dá)式規(guī)則的Unit到集合colMatches中。For Each unit In colMatches然后將Unit信息保存到二維數(shù)組QuotationMarks (χ, y)中。
NextFor each row in QuotationMarks用{#序號}替換sSql中相關(guān)元素。NextExtractQuotationMarks =替換后的 sSqlEnd Function。在步驟306,用第二標(biāo)識符替換SQL串中的小括號和小括號中的值(函數(shù)參數(shù)),并將第二標(biāo)識符和被替換的函數(shù)參數(shù)信息存放到數(shù)組arrN0de(第二參數(shù)對照表)中,arrNode可以理解為存放所有函數(shù)參數(shù)的二維數(shù)組,第二標(biāo)識符的格式為序號};為了解決函數(shù)混合嵌套的情況,提取小括號的值必須是最小單位,正側(cè)表達(dá)式為 \([~\(|\)]*\),并且需要記錄該提取值所在層級,此處需要用遞歸算法分階提取函數(shù)參數(shù),相關(guān)算法實現(xiàn)描述如下Function ChangeString(sSql As String, rowX As Long)As String從sSql中提取所有滿足正側(cè)表達(dá)式\(Γ\(|\)]*\)的unit到集合colMatches 中。For Each unit In colMatches保存unit信息到二維數(shù)組arrNode (χ, y)。NextFor each row in arrNode用序號}替換sSql中相關(guān)元素。Next rowXChangeString 被替換過的 sSql, LevelIDChangeString =被替換過的 sSqlEnd Function。在步驟308,在被格式化后的SQL串和arrNode中,提取滿足正側(cè)表達(dá)式函數(shù)名稱(\s*{iW-9]*})的部分,由相應(yīng)轉(zhuǎn)換方法(分解提取的函數(shù)參數(shù),按照目標(biāo)數(shù)據(jù)的規(guī)則重新編寫分解的函數(shù)參數(shù))生成替換串。相關(guān)算法實現(xiàn)描述如下Function ChangeFunctionX(SqlStringToReplace as string)提取SqlStringToR印lace中滿足正側(cè)表達(dá)式函數(shù)名(\s* {§
*})的Unit到 colMatchesFor Each Unit In colMatches提取該Unit的序號。根據(jù)Unit序號找到該函數(shù)參數(shù)。對函數(shù)參數(shù)進(jìn)行分解。重新編寫分解的函數(shù)參數(shù)以符合目標(biāo)數(shù)據(jù)的規(guī)則。Next遍列數(shù)組 arrnode。For each row in arrnode提取arrnode (row)中滿足正側(cè)表達(dá)式函數(shù)名(\s*{@
*})的Unit到
9colMatches。For Each Unit In colMatches提取該Unit的序號。根據(jù)Unit序號找到該函數(shù)參數(shù)。對函數(shù)參數(shù)進(jìn)行分解。重新編寫分解的函數(shù)參數(shù)以符合目標(biāo)數(shù)據(jù)的規(guī)則并將重新編寫的函數(shù)參數(shù)保存到 arrnode (row)。End Function。步驟312,將生成的替換串來替換被格式化后的SQL串中對應(yīng)的標(biāo)識符
*}。在步驟314,完成所有函數(shù)參數(shù)的替換操作后,遍歷數(shù)組QuotationMarks,還原所有用戶值,即將第一參數(shù)對照表中對應(yīng)的用戶值替換被格式化后的SQL串中對應(yīng)的標(biāo)識符 {#
*}。相關(guān)算法實現(xiàn)描述如下Function ReBuildQuotationMarks(SqlStringToReplace as string)As Stringtmp String = m_SqlStringReplacedFor each row in QuotationMarksSqlStringReplaced = Replace ( (SqlStringToReplace, QuotationMarks(oldValue, row), QuotationMarks(m_ValueChanged, row))NextReBuildQuotationMarks = SqlStringReplacedEnd Function。在步驟310還步驟308之間還有其他的語法的替換,在此不再贅述。在步驟316,得到能被目標(biāo)數(shù)據(jù)庫執(zhí)行的SQL串,將最終的結(jié)果返回給調(diào)用者。本發(fā)明的技術(shù)方案將來自調(diào)用者的SQL語句進(jìn)行替換處理,首先用第一標(biāo)識符來替代用戶值,保存第一標(biāo)識與對應(yīng)的用戶值,然后按照最小單位原則,通過迭代方法用第二標(biāo)識符來替代函數(shù)參數(shù),保存第二標(biāo)識符與對應(yīng)的函數(shù)參數(shù)以及函數(shù)參數(shù)所在的層級,這樣就得到格式化處理的SQL語句,最后,需要將格式化處理的SQL語句轉(zhuǎn)換為目標(biāo)數(shù)據(jù)庫可執(zhí)行的語句。在轉(zhuǎn)換過程中,首先按照從高級到低級(根據(jù)記錄的層級)的順序取出函數(shù)參數(shù)進(jìn)行處理,而在提取函數(shù)參數(shù)時,則根據(jù)第二參數(shù)對照表獲取第二標(biāo)識符對應(yīng)的函數(shù)參數(shù),將處理后的函數(shù)參數(shù)放回其在格式化的SQL語句中的原位置,處理的過程為分解提取的函數(shù)參數(shù),按照目標(biāo)數(shù)據(jù)庫執(zhí)行的SQL函數(shù)規(guī)則重新編寫分解的函數(shù)參數(shù)。然后,根據(jù)第一標(biāo)識從第一參數(shù)對照表中找出對應(yīng)的用戶值,還原用戶值。這樣就得到目標(biāo)數(shù)據(jù)庫可執(zhí)行的語句并返回調(diào)用者。以上所述僅為本發(fā)明的優(yōu)選實施例而已,并不用于限制本發(fā)明,對于本領(lǐng)域的技術(shù)人員來說,本發(fā)明可以有各種更改和變化。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
1.一種SQL函數(shù)轉(zhuǎn)換裝置,其特征在于,包括第一替換單元,用標(biāo)識符替換來自調(diào)用者的SQL函數(shù)中的參數(shù),得到迭代后的SQL函數(shù);數(shù)據(jù)庫單元,將所述標(biāo)識符與所述參數(shù)對應(yīng)保存為參數(shù)對照表;處理單元,根據(jù)所述迭代后的SQL函數(shù)中的標(biāo)識符,從所述參數(shù)對照表提取出所述參數(shù),對所述參數(shù)進(jìn)行轉(zhuǎn)換處理;第二替換單元,將處理后的所述參數(shù)替換所述迭代后的SQL函數(shù)中對應(yīng)的標(biāo)識符,以得到目標(biāo)數(shù)據(jù)庫執(zhí)行的SQL函數(shù)。
2.根據(jù)權(quán)利要求1所述的SQL函數(shù)轉(zhuǎn)換裝置,其特征在于,所述第一替換單元用第一標(biāo)識符替換所述SQL函數(shù)中的單引號中的用戶值,用第二標(biāo)識符替換所述SQL函數(shù)中的小括號中的函數(shù)參數(shù),所述迭代后的SQL函數(shù)包含所述第一標(biāo)識符和所述第二標(biāo)識符。
3.根據(jù)權(quán)利要求2所述的SQL函數(shù)轉(zhuǎn)換裝置,其特征在于,所述數(shù)據(jù)庫單元將所述第一標(biāo)識符與所述用戶值對應(yīng)保存為第一參數(shù)對照表,將所述第二標(biāo)識符與所述函數(shù)參數(shù)對應(yīng)保存為第二參數(shù)對照表,并在所述第二參數(shù)對照表中保存所述函數(shù)參數(shù)在所述SQL函數(shù)中的層級。
4.根據(jù)權(quán)利要求3所述的SQL函數(shù)轉(zhuǎn)換裝置,其特征在于,所述第二替換單元根據(jù)所述迭代后的SQL函數(shù)中的所述第一標(biāo)識符和所述第一參數(shù)對照表提取出對應(yīng)的用戶值,將提取出的所述用戶值替換所述迭代后的SQL函數(shù)中對應(yīng)的所述第一標(biāo)識符;所述處理單元還包括分解單元和編寫單元,所述分解單元根據(jù)所述迭代后的SQL函數(shù)中的所述第二標(biāo)識符,從所述第二參數(shù)對照表提取出所述函數(shù)參數(shù),分解提取出的所述函數(shù)參數(shù),所述編寫單元按照目標(biāo)數(shù)據(jù)庫執(zhí)行的SQL函數(shù)規(guī)則重新編寫分解的所述函數(shù)參數(shù),所述第二替換單元將重新編寫后的函數(shù)參數(shù)替換所述迭代后的SQL函數(shù)中對應(yīng)的第二標(biāo)識符。
5.根據(jù)權(quán)利要求2至4中任一項所述的SQL函數(shù)轉(zhuǎn)換裝置,其特征在于,所述第一替換單元采用遞歸算法將所述第二標(biāo)識符按照從低級到高級的順序分階替換所述SQL函數(shù)中的小括號中的函數(shù)參數(shù),所述第二替換單元按照從高級到低級的順序?qū)⑻幚砗蟮乃龊瘮?shù)參數(shù)替換所述迭代后的SQL函數(shù)中對應(yīng)的第二標(biāo)識符,以得到所述目標(biāo)數(shù)據(jù)庫執(zhí)行的SQL 函數(shù)。
6.一種SQL函數(shù)轉(zhuǎn)換方法,其特征在于,包括步驟202,用標(biāo)識符替換來自調(diào)用者的SQL函數(shù)中的參數(shù),得到迭代后的SQL函數(shù);步驟204,將所述標(biāo)識符與所述參數(shù)對應(yīng)保存為參數(shù)對照表;步驟206,根據(jù)所述迭代后的SQL函數(shù)中的標(biāo)識符,從所述參數(shù)對照表提取出所述參數(shù),對所述參數(shù)進(jìn)行轉(zhuǎn)換處理,將處理后的所述參數(shù)替換所述迭代后的SQL函數(shù)中對應(yīng)的標(biāo)識符,以得到目標(biāo)數(shù)據(jù)庫執(zhí)行的SQL函數(shù)。
7.根據(jù)權(quán)利要求6所述的SQL函數(shù)轉(zhuǎn)換方法,其特征在于,所述步驟202具體包括所述參數(shù)包括用戶值和函數(shù)參數(shù),用第一標(biāo)識符替換所述SQL函數(shù)中的單引號中的所述用戶值,用第二標(biāo)識符替換所述SQL函數(shù)中的小括號中的所述函數(shù)參數(shù),所述迭代后的SQL函數(shù)包含所述第一標(biāo)識符和所述第二標(biāo)識符。
8.根據(jù)權(quán)利要求7所述的SQL函數(shù)轉(zhuǎn)換方法,其特征在于,所述步驟204具體包括將所述第一標(biāo)識符與所述用戶值對應(yīng)保存為第一參數(shù)對照表,將所述第二標(biāo)識符與所述函數(shù)參數(shù)對應(yīng)保存為第二參數(shù)對照表,并在所述第二參數(shù)對照表中保存所述函數(shù)參數(shù)在所述 SQL函數(shù)中的層級。
9.根據(jù)權(quán)利要求8所述的SQL函數(shù)轉(zhuǎn)換方法,其特征在于,所述步驟206具體包括 步驟2062,根據(jù)所述迭代后的SQL函數(shù)中的所述第二標(biāo)識符,從所述第二參數(shù)對照表提取出所述函數(shù)參數(shù),分解提取出的所述函數(shù)參數(shù),按照目標(biāo)數(shù)據(jù)庫執(zhí)行的SQL函數(shù)規(guī)則重新編寫分解的所述函數(shù)參數(shù),將重新編寫后的函數(shù)參數(shù)替換所述迭代后的SQL函數(shù)中對應(yīng)的第二標(biāo)識符;步驟2064,根據(jù)所述迭代后的SQL函數(shù)中的所述第一標(biāo)識符和所述第一參數(shù)對照表提取出對應(yīng)的用戶值,將提取出的所述用戶值替換所述迭代后的SQL函數(shù)中對應(yīng)的所述第一標(biāo)識符。
10.根據(jù)權(quán)利要求7至9中任一項所述的SQL函數(shù)轉(zhuǎn)換方法,其特征在于,采用遞歸算法將所述第二標(biāo)識符按照從低級到高級的順序分階替換所述SQL函數(shù)中的小括號中的函數(shù)參數(shù),在得到所述目標(biāo)數(shù)據(jù)庫執(zhí)行的SQL函數(shù)時,按照從高級到低級的順序?qū)⑻幚砗蟮乃龊瘮?shù)參數(shù)替換所述迭代后的SQL函數(shù)中對應(yīng)的第二標(biāo)識符。
全文摘要
本發(fā)明提供了一種SQL函數(shù)轉(zhuǎn)換裝置,包括第一替換單元,用標(biāo)識符替換來自調(diào)用者的SQL函數(shù)中的參數(shù),得到迭代后的SQL函數(shù);數(shù)據(jù)庫單元,將所述標(biāo)識符與所述參數(shù)對應(yīng)保存為參數(shù)對照表;處理單元,根據(jù)所述迭代后的SQL函數(shù)中的標(biāo)識符,從所述參數(shù)對照表提取出所述參數(shù),對所述參數(shù)進(jìn)行轉(zhuǎn)換處理;第二替換單元,將處理后的所述參數(shù)替換所述迭代后的SQL函數(shù)中對應(yīng)的標(biāo)識符,以得到目標(biāo)數(shù)據(jù)庫執(zhí)行的SQL函數(shù)。根據(jù)本發(fā)明的技術(shù)方案,可以提供全面且安全的函數(shù)替換技術(shù)。本發(fā)明還提供了一種SQL函數(shù)轉(zhuǎn)換方法。
文檔編號G06F17/30GK102436474SQ20111029558
公開日2012年5月2日 申請日期2011年9月29日 優(yōu)先權(quán)日2011年9月29日
發(fā)明者劉新峰, 婁東生, 孫東旺 申請人:暢捷通信息技術(shù)股份有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
江孜县| 和平区| 随州市| 内丘县| 白山市| 重庆市| 全南县| 蓝田县| 阿拉善右旗| 疏勒县| 新昌县| 舞阳县| 于田县| 扎兰屯市| 宁蒗| 天津市| 香港 | 墨江| 平定县| 海安县| 梁山县| 竹北市| 汕头市| 崇义县| 商洛市| 瑞金市| 得荣县| 陵川县| 张家港市| 普陀区| 万山特区| 新巴尔虎右旗| 晋城| 绥芬河市| 天柱县| 吴堡县| 姚安县| 东乡县| 徐闻县| 灌云县| 武定县|