本申請涉及計(jì)算機(jī)領(lǐng)域,尤其涉及一種用于分布式系統(tǒng)的執(zhí)行過程化SQL語句的技術(shù)。
背景技術(shù):
::傳統(tǒng)關(guān)系型數(shù)據(jù)庫為數(shù)據(jù)庫使用者提供了SQL(StructuredQueryLanguage,結(jié)構(gòu)化查詢語言)語言作為數(shù)據(jù)庫操作的接口,幾乎所有的數(shù)據(jù)庫應(yīng)用都是建立在SQL語言接口之上,而SQL語言的支持程度則是一個(gè)數(shù)據(jù)庫系統(tǒng)是否健壯的最重要指標(biāo)。隨著企業(yè)業(yè)務(wù)的快速發(fā)展,大數(shù)據(jù)的處理需求成為了所有行業(yè)不可避免的問題。而現(xiàn)有的大數(shù)據(jù)平臺對SQL語言的支持十分有限,同時(shí)也缺少很多對SQL語言的優(yōu)化,更沒有對過程化SQL語言的支持。這一局限極大的增加了傳統(tǒng)應(yīng)用向大數(shù)據(jù)平臺的遷移成本,成為了傳統(tǒng)應(yīng)用遷移至大數(shù)據(jù)平臺的最大難題。因此,增強(qiáng)在大數(shù)據(jù)平臺上的SQL語言完整度,降低企業(yè)的遷移成本,是一個(gè)很有意義和挑戰(zhàn)的課題。技術(shù)實(shí)現(xiàn)要素:本申請的目的是提供一種用于分布式系統(tǒng)的執(zhí)行過程化SQL語句的方法和設(shè)備,以解決現(xiàn)有大數(shù)據(jù)平臺對SQL語言支持完整度的問題。根據(jù)本申請的一個(gè)方面提供的一種用于分布式系統(tǒng)的執(zhí)行過程化SQL語句的方法,其中,A對過程化SQL語句進(jìn)行詞法分析和語法分析,以建立所述過程化SQL語句的中間表示;B對所述中間表示進(jìn)行語義分析,以轉(zhuǎn)化為若干執(zhí)行塊,并逐塊執(zhí)行所述執(zhí)行塊。進(jìn)一步地,所述步驟B還包括:記錄若干所述執(zhí)行塊之間的依賴關(guān)系;基于所述依賴關(guān)系,從起始的執(zhí)行塊起,依次執(zhí)行所述執(zhí)行塊。進(jìn)一步地,所述過程化SQL語句包括若干非標(biāo)準(zhǔn)SQL語句。進(jìn)一步地,所述過程化SQL語句包括若干非標(biāo)準(zhǔn)SQL語句和若干標(biāo)準(zhǔn)SQL語句。進(jìn)一步地,所述步驟B包括:B1對所述過程化SQL語句進(jìn)行語義分析,將所述非標(biāo)準(zhǔn)SQL語句的中間表示轉(zhuǎn)化為待解釋執(zhí)行的執(zhí)行塊,將所述標(biāo)準(zhǔn)SQL語句的中間表示轉(zhuǎn)化為標(biāo)準(zhǔn)SQL語句執(zhí)行塊;B2解釋執(zhí)行所述待解釋執(zhí)行的執(zhí)行塊;B3將所述標(biāo)準(zhǔn)SQL語句執(zhí)行塊發(fā)送給分布式系統(tǒng)的計(jì)算引擎進(jìn)行執(zhí)行。進(jìn)一步地,所述步驟B1包括:根據(jù)所述過程化SQL語句的中間表示,分析并記錄所述中間表示的屬性,所述屬性包括參量、變量和類型;所述步驟B2包括:創(chuàng)建基于棧式的函數(shù)執(zhí)行框架;在所述函數(shù)執(zhí)行框架的棧中分配所述中間表示的屬性;利用所述函數(shù)執(zhí)行框架,逐塊執(zhí)行所述執(zhí)行塊。進(jìn)一步地,所述步驟B3還包括:分析所述標(biāo)準(zhǔn)SQL語句的中間表示是否用到其他中間表示的變量,若用到,則記錄所述變量的名稱和在標(biāo)準(zhǔn)SQL語句中的位置,并在執(zhí)行到所述標(biāo)準(zhǔn)SQL語句執(zhí)行塊時(shí),先獲取所述變量的值,將所述變量的值替換為常量后存入標(biāo)準(zhǔn)SQL語句執(zhí)行塊。進(jìn)一步地,所述B還包括:將所述分布式系統(tǒng)的計(jì)算引擎所執(zhí)行的結(jié)果存儲于所述分布式系統(tǒng)的存儲裝置,以供后續(xù)執(zhí)行塊讀取使用。進(jìn)一步地,所述待解釋執(zhí)行的執(zhí)行塊包括以下至少任一項(xiàng):起止執(zhí)行塊、賦值語句執(zhí)行塊、控制語句執(zhí)行塊、讀取執(zhí)行塊、調(diào)用執(zhí)行塊。根據(jù)本申請另一方面提供的一種用于分布式系統(tǒng)的執(zhí)行過程化SQL 語句的設(shè)備,其中,所述設(shè)備包括:第一裝置,用于對過程化SQL語句進(jìn)行詞法分析和語法分析,以建立所述過程化SQL語句的中間表示;第二裝置,用于對所述中間表示進(jìn)行語義分析,以轉(zhuǎn)化為若干執(zhí)行塊,并逐塊執(zhí)行所述執(zhí)行塊。進(jìn)一步地,所述第二裝置還用于:記錄若干所述執(zhí)行塊之間的依賴關(guān)系;基于所述依賴關(guān)系,從起始的執(zhí)行塊起,依次執(zhí)行所述執(zhí)行塊。進(jìn)一步地,所述過程化SQL語句包括若干非標(biāo)準(zhǔn)SQL語句。進(jìn)一步地,所述過程化SQL語句包括若干非標(biāo)準(zhǔn)SQL語句和若干標(biāo)準(zhǔn)SQL語句。進(jìn)一步地,所述第二裝置包括:第二一單元,用于對所述過程化SQL語句進(jìn)行語義分析,將所述非標(biāo)準(zhǔn)SQL語句轉(zhuǎn)化為待解釋執(zhí)行的執(zhí)行塊,將所述標(biāo)準(zhǔn)SQL語句轉(zhuǎn)化為標(biāo)準(zhǔn)SQL語句執(zhí)行塊;第二二單元,用于解釋執(zhí)行所述待解釋執(zhí)行的執(zhí)行塊;第二三單元,用于將所述標(biāo)準(zhǔn)SQL語句執(zhí)行塊發(fā)送給分布式系統(tǒng)的計(jì)算引擎進(jìn)行執(zhí)行。進(jìn)一步地,所述第二一單元用于:根據(jù)所述過程化SQL語句的中間表示,分析并記錄所述中間表示的屬性,所述屬性包括參量、變量和類型;所述第二二單元用于:創(chuàng)建基于棧式的函數(shù)執(zhí)行框架;在所述函數(shù)執(zhí)行框架的棧中分配所述中間表示的屬性;利用所述函數(shù)執(zhí)行框架,逐塊執(zhí)行所述執(zhí)行塊。進(jìn)一步地,所述第二三單元還用于:分析所述標(biāo)準(zhǔn)SQL語句的中間表示是否用到其他中間表示的變量,若用到,則記錄所述變量的名稱和在標(biāo)準(zhǔn)SQL語句中的位置,并在執(zhí)行到所述標(biāo)準(zhǔn)SQL語句執(zhí)行塊時(shí),先獲取所述變量的值,將所述變量的值 替換為常量后存入標(biāo)準(zhǔn)SQL語句執(zhí)行塊。進(jìn)一步地,所述第二裝置還包括:第二五單元,用于將所述分布式系統(tǒng)的計(jì)算引擎所執(zhí)行的結(jié)果存儲于所述分布式系統(tǒng)的存儲裝置,以供后續(xù)執(zhí)行塊讀取使用。進(jìn)一步地,所述待解釋執(zhí)行的執(zhí)行塊包括以下至少任一項(xiàng):起止執(zhí)行塊、賦值語句執(zhí)行塊、控制語句執(zhí)行塊、讀取執(zhí)行塊、調(diào)用執(zhí)行塊。與現(xiàn)有技術(shù)相比,本申請通過提供了用于分布式系統(tǒng)的執(zhí)行過程化SQL語句的方法和設(shè)備,對過程化SQL語句進(jìn)行詞法分析和語法分析,以建立所述過程化SQL語句的中間表示;對所述中間表示進(jìn)行語義分析,以轉(zhuǎn)化為若干執(zhí)行塊;逐塊執(zhí)行所述執(zhí)行塊。本申請所述方法和設(shè)備增強(qiáng)了大數(shù)據(jù)平臺上的SQL語言表達(dá)能力,使得用戶可以在數(shù)據(jù)庫層完成復(fù)雜的業(yè)務(wù)邏輯。通過與現(xiàn)有過程化SQL語言的語法兼容,使得現(xiàn)有應(yīng)用遷移到大數(shù)據(jù)平臺的成本大幅降低。附圖說明通過閱讀參照以下附圖所作的對非限制性實(shí)施例所作的詳細(xì)描述,本申請的其它特征、目的和優(yōu)點(diǎn)將會變得更明顯:圖1示出根據(jù)本申請一個(gè)方面的一種用于分布式系統(tǒng)的執(zhí)行過程化SQL語句的方法流程圖;圖2示出根據(jù)本申請一具體實(shí)施例中的一種用于分布式系統(tǒng)的執(zhí)行過程化SQL語句的中間表示的語法樹示意圖;圖3示出根據(jù)本申請一具體實(shí)施例中的一種用于分布式系統(tǒng)的執(zhí)行過程化SQL語句的執(zhí)行塊示意圖;圖4示出根據(jù)本申請一個(gè)方面的用于分布式系統(tǒng)的執(zhí)行過程化SQL語句的設(shè)備示意圖;附圖中相同或相似的附圖標(biāo)記代表相同或相似的部件。具體實(shí)施方式下面結(jié)合附圖對本申請作進(jìn)一步詳細(xì)描述。圖1示出根據(jù)本申請一個(gè)方面的一種用于分布式系統(tǒng)的執(zhí)行過程化SQL語句的方法流程圖,結(jié)合圖1,所述方法包括:步驟S11和步驟S12。其中,在所述步驟S11中,對過程化SQL語句進(jìn)行詞法分析和語法分析,以建立所述過程化SQL語句的中間表示;在所述步驟S12中,對所述中間表示進(jìn)行語義分析,以轉(zhuǎn)化為若干執(zhí)行塊,并逐塊執(zhí)行所述執(zhí)行塊。在此,所述過程化SQL語句來源可以包括用戶設(shè)備的輸入或通過JDBC(JavaDataBaseConnectivity,JAVA數(shù)據(jù)庫連接)/ODBC(OpenDatabaseConnectivity,ODBC)標(biāo)準(zhǔn)接口來中間設(shè)備發(fā)送的請求等。所述過程化SQL語句可以包括若干非標(biāo)準(zhǔn)SQL語句,此外,所述過程化SQL語句還可以包括若干非標(biāo)準(zhǔn)SQL語句和若干標(biāo)準(zhǔn)SQL語句。其中,非標(biāo)準(zhǔn)SQL語句可以例如但不限于:起止語句(BEGIN/END)、控制語句(IF/ELSE)、賦值語句、循環(huán)語句、游標(biāo)(CURSOR)、異常捕獲等;所述標(biāo)準(zhǔn)SQL語句可以是DML(DataManipulationLanguage,數(shù)據(jù)操縱語言命令)。首先,在所述步驟S11中,對過程化SQL語句進(jìn)行詞法分析和語法分析,以建立所述過程化SQL語句的中間表示。在所述步驟S11中,通過在標(biāo)準(zhǔn)SQL的詞法分析器和語法分析器的基礎(chǔ)上進(jìn)行了擴(kuò)展,在詞法分析器和語法分析器中增加對過程化SQL語句的詞法和語法的定義,使其能夠在對過程化SQL語句進(jìn)行詞法分析和語法分析時(shí),識別過程化SQL語句的特有關(guān)鍵詞和語法結(jié)構(gòu),包括:函數(shù)和過程的定義;函數(shù)參數(shù)的定義;函數(shù)變量的定義,標(biāo)量、集合和記錄數(shù)據(jù)類型,賦值語句,條件分支語句,LOOP循環(huán)語句,F(xiàn)OR循環(huán)語句,F(xiàn)ORALL循環(huán)語句,WHILE循環(huán)語句,CONTINUE語句,EXIT語句,返回語句,DML語句。例如,遇到關(guān)鍵詞(Keyword)為select,非標(biāo)準(zhǔn)SQL語句,遇到關(guān)鍵詞包括:Beginprocedurestatement……End,則識別為一個(gè)起止執(zhí)行的中間語句(blockstatement)。在具體的實(shí)施例中,以下代碼示例一中描述的過程化SQL語句包括:上述過程化SQL語句包括,開始:“BEGIN”、結(jié)束:“END”、如果:“IF”和否則:“ELS”的非標(biāo)準(zhǔn)SQL語句,以及從表格1中選擇:“select*fromtable1”,從表格2中選擇:“select*fromtable2”這兩個(gè)標(biāo)準(zhǔn)SQL語句,代碼示例一的過程化SQL語句表示:用于根據(jù)變量var值是否大于0來決定是從table1還是table2來做查詢。接上例,詞法分析器需要擴(kuò)展為能夠識別關(guān)鍵字BEGIN、END、IF、THEN、ELSE。語法分析器需要擴(kuò)展為能夠識別BEGIN、END、IF、THEN、ELSE等語句的語法結(jié)構(gòu)。擴(kuò)展之后的詞法分析器和語法分析器能夠?qū)⑸侠械倪^程化SQL語句識別,形成圖2所示的中間表示的語法樹。接著,在所述步驟S12中,對所述中間表示進(jìn)行語義分析,以轉(zhuǎn)化為若干執(zhí)行塊,并逐塊執(zhí)行所述執(zhí)行塊。進(jìn)一步地,在所述步驟S12中,還包括:記錄若干所述執(zhí)行塊之間的依賴關(guān)系;基于所述依賴關(guān)系,從起始的執(zhí)行塊起,依次執(zhí)行所述執(zhí)行塊。當(dāng)所述過程化SQL只包括非標(biāo)準(zhǔn)SQL語句時(shí),將過程化SQL語句全部轉(zhuǎn)化為待解釋執(zhí)行的執(zhí)行塊,所述待解釋執(zhí)行的執(zhí)行塊可以包括以下至少任一項(xiàng):賦值語句執(zhí)行塊、控制語句執(zhí)行塊(例如IF/ELSE、GOTO、LOOP、FOR、FORALL、WHILE/CONTINUE/EXIT)、讀取執(zhí)行塊及調(diào)用執(zhí)行塊。當(dāng)所述過程化SQL語句包括非標(biāo)準(zhǔn)SQL語句和標(biāo)準(zhǔn)SQL語句時(shí),對所述過程化SQL語句進(jìn)行語義分析,將所述非標(biāo)準(zhǔn)SQL語句轉(zhuǎn)化為待解釋執(zhí)行的執(zhí)行塊,將所述標(biāo)準(zhǔn)SQL語句轉(zhuǎn)化為標(biāo)準(zhǔn)SQL語句執(zhí)行塊。圖3示出根據(jù)本申請一具體實(shí)施例中的一種用于分布式系統(tǒng)的執(zhí)行過 程化SQL語句的執(zhí)行塊示意圖;接上例,將圖2所示的中間表示轉(zhuǎn)化為圖3所示的執(zhí)行塊,其中,包括根執(zhí)行塊、條件判斷執(zhí)行塊、表達(dá)式執(zhí)行塊、標(biāo)準(zhǔn)SQL語句執(zhí)行塊、變量訪問執(zhí)行塊和常量訪問執(zhí)行塊,并且所述執(zhí)行塊之間的連線關(guān)系即為其依賴關(guān)系,在執(zhí)行時(shí),從起始執(zhí)行塊(Begin)起,依此執(zhí)行所述執(zhí)行塊。在執(zhí)行過程中,所述步驟S12包括:步驟S121、步驟S122和步驟S123。所述步驟S121:對所述過程化SQL語句進(jìn)行語義分析,將所述非標(biāo)準(zhǔn)SQL語句的中間表示轉(zhuǎn)化為待解釋執(zhí)行的執(zhí)行塊,將所述標(biāo)準(zhǔn)SQL語句的中間表示轉(zhuǎn)化為標(biāo)準(zhǔn)SQL語句執(zhí)行塊;所述步驟S122:解釋執(zhí)行所述待解釋執(zhí)行的執(zhí)行塊;所述步驟S123:將所述標(biāo)準(zhǔn)SQL語句執(zhí)行塊發(fā)送給分布式系統(tǒng)的計(jì)算引擎進(jìn)行執(zhí)行。進(jìn)一步地,在所述步驟S121還包括:根據(jù)所述過程化SQL語句的中間表示,分析并記錄所述中間表示的屬性,所述屬性包括參量、變量和類型;則在所述步驟S122根據(jù)所述中間表示的屬性,利用基于棧式的函數(shù)執(zhí)行框架執(zhí)行所述執(zhí)行塊,包括:創(chuàng)建基于棧式的函數(shù)執(zhí)行框架;在所述函數(shù)執(zhí)行框架的棧中分配所述中間表示的屬性;利用所述函數(shù)執(zhí)行框架,逐塊執(zhí)行所述執(zhí)行塊。進(jìn)一步地,所述步驟S123還包括:分析所述標(biāo)準(zhǔn)SQL語句的中間表示是否用到其他中間表示的變量,若用到,則記錄所述變量的名稱和在標(biāo)準(zhǔn)SQL語句中的位置,并在執(zhí)行到所述標(biāo)準(zhǔn)SQL語句執(zhí)行塊時(shí),先獲取所述變量的值,將所述變量的值替換為常量后存入標(biāo)準(zhǔn)SQL語句執(zhí)行塊。隨后將變量的值替換為常量的標(biāo)準(zhǔn)SQL語句執(zhí)行塊發(fā)送分布式系統(tǒng)的計(jì)算引擎進(jìn)行執(zhí)行。具體地,代碼示例二如下:DeclareVarint:=100BeginSelect*fromTwherecol<varEnd所述代碼示例二描述了一個(gè)整型(int)的變量var,首先定義變量Var為100,開始執(zhí)行從表格T中選擇小于var的數(shù)據(jù)。在步驟S123中,首先通過語義分析,分析到標(biāo)準(zhǔn)SQL語句“Select*fromTwherecol<var”用到其他中間表示的變量var,記錄變量的名稱為var和在標(biāo)準(zhǔn)SQL語句中的位置為小于號后;在執(zhí)行到所述標(biāo)準(zhǔn)SQL語句執(zhí)行塊時(shí),先獲取所述變量var的值為100(執(zhí)行至此的變量通常都已通過之前執(zhí)行過程獲得值的結(jié)果),將所述變量的值替換為常量100后存入標(biāo)準(zhǔn)SQL語句執(zhí)行塊(Select*fromTwherecol<var的執(zhí)行塊),隨后將變量的值替換為常量的標(biāo)準(zhǔn)SQL語句執(zhí)行塊發(fā)送分布式系統(tǒng)的計(jì)算引擎進(jìn)行執(zhí)行。通過交由分布式系統(tǒng)的計(jì)算引擎進(jìn)行執(zhí)行,能夠提高數(shù)據(jù)處理效率,進(jìn)而實(shí)現(xiàn)數(shù)據(jù)的實(shí)時(shí)處理,使得用戶可以在數(shù)據(jù)庫層完成復(fù)雜的業(yè)務(wù)邏輯,并且通過與現(xiàn)有過程化SQL語言的語法兼容,使得現(xiàn)有應(yīng)用遷移到大數(shù)據(jù)平臺的成本大幅降低。進(jìn)一步地,所述步驟S12還包括:步驟S124,在所述步驟S124中,將所述分布式系統(tǒng)的計(jì)算引擎所執(zhí)行的結(jié)果存儲于所述分布式系統(tǒng)的存儲裝置,以供后續(xù)執(zhí)行塊讀取使用。例如,游標(biāo)(CURSOR)語句可以用于過程化SQL語句和標(biāo)準(zhǔn)SQL語句之間的數(shù)據(jù)調(diào)用,可以讀取存儲于所述分布式系統(tǒng)的存儲裝置的數(shù)據(jù)。具體地,如以下示例代碼三所示:DeclarecursorCisSelectnamefromT//從T表中選name字段的一列數(shù)據(jù)Var_namestring//定義本地變量BeginOpenC//打開游標(biāo)語句FetchCintovar_name//第一種情況,從游標(biāo)C中獲取一條數(shù)據(jù)到本地的變量Var_name……Putline(var_name)//打印本地的Var_name示例代碼三表示,定義游標(biāo)C表示從T表中選name字段的一列數(shù)據(jù),定義本地變量var_name,開始執(zhí)行打開游標(biāo)C,從游標(biāo)C中獲取一條數(shù)據(jù)到本地變量var_name中,此后本地變量var_name的數(shù)據(jù)。最后可以通過游標(biāo)內(nèi)部的狀態(tài)確定是否已取完。此外,如以下示例代碼四所示:DeclarecursorCisSelectnamefromT//從T表中選name字段的一列數(shù)據(jù)Var_namestring//定義本地變量BeginOpenC//打開游標(biāo)語句FetchCbuckcollectinto本地?cái)?shù)組//從游標(biāo)C中獲取所有數(shù)據(jù)到本地?cái)?shù)組Limit100//最大取100條示例代碼四表示,定義游標(biāo)C表示從T表中選name字段的一列數(shù)據(jù),定義本地變量var_name,開始執(zhí)行打開游標(biāo)C,從游標(biāo)C中獲取所有數(shù)據(jù)到本地?cái)?shù)組,可以限制最大取100條。最后可以通過游標(biāo)內(nèi)部的狀態(tài)確定是否已取完。在步驟S124中,通過游標(biāo)(CURSOR)語句可以將存儲于分布式系統(tǒng)的存儲裝置中的數(shù)據(jù)讀取,并未后續(xù)執(zhí)行塊在執(zhí)行中使用。當(dāng)然,本領(lǐng)域技術(shù)人員應(yīng)當(dāng)能夠理解,所述步驟S124通過游標(biāo)讀取分布式系統(tǒng)的存儲裝置中的數(shù)據(jù)的方式僅為舉例,其他能夠讀取方式適用于本申請的,也包含在本申請的思想范圍之內(nèi)。圖4示出根據(jù)本申請一個(gè)方面的用于分布式系統(tǒng)的執(zhí)行過程化SQL語句的設(shè)備示意圖,結(jié)合圖4,所述設(shè)備1包括:第一裝置11和第二裝置S12。其中,在所述第一裝置11中,對過程化SQL語句進(jìn)行詞法分析和語法分析,以建立所述過程化SQL語句的中間表示;在所述第二裝置12中,對所述中間表示進(jìn)行語義分析,以轉(zhuǎn)化為若干執(zhí)行塊并逐塊執(zhí)行所述執(zhí)行塊。在此,所述過程化SQL語句來源可以包括用戶設(shè)備的輸入或通過JDBC(JavaDataBaseConnectivity,JAVA數(shù)據(jù)庫連接)/ODBC(OpenDatabaseConnectivity,ODBC)標(biāo)準(zhǔn)接口來中間設(shè)備發(fā)送的請求等。所述過程化SQL語句可以包括若干非標(biāo)準(zhǔn)SQL語句,此外,所述過程化SQL語句還可以包括若干非標(biāo)準(zhǔn)SQL語句和若干標(biāo)準(zhǔn)SQL語句。其中,非標(biāo)準(zhǔn)SQL語句可以例如但不限于:起止語句(BEGIN/END)、控制語句(IF/ELSE)、賦值語句、循環(huán)語句、游標(biāo)、異常捕獲等;所述標(biāo)準(zhǔn)SQL語句可以是DML(DataManipulationLanguage,數(shù)據(jù)操縱語言命令)。首先,在所述第一裝置11中,對過程化SQL語句進(jìn)行詞法分析和語法分析,以建立所述過程化SQL語句的中間表示。在所述第一裝置11中,通過在標(biāo)準(zhǔn)SQL的詞法分析器和語法分析器的基礎(chǔ)上進(jìn)行了擴(kuò)展,在詞法分析器和語法分析器中增加對過程化SQL語句的詞法和語法的定義,使其能夠在對過程化SQL語句進(jìn)行詞法分析和語法分析時(shí),識別過程化SQL語句的特有關(guān)鍵詞和語法結(jié)構(gòu),包括:函數(shù)和過程的定義;函數(shù)參數(shù)的定義;函數(shù)變量的定義,標(biāo)量、集合和記錄數(shù)據(jù)類型,賦值語句,條件分支語句,LOOP循環(huán)語句,F(xiàn)OR循環(huán)語句,F(xiàn)ORALL循環(huán)語句,WHILE循環(huán)語句,CONTINUE語句,EXIT語句,返回語句,DML語句。例如,遇到關(guān)鍵詞(Keyword)為select,非標(biāo)準(zhǔn)SQL語句,遇到關(guān)鍵詞包括:Beginprocedurestatement……End,則識別為一個(gè)起止執(zhí)行的中間語句(blockstatement)。在具體的實(shí)施例中,例如一段過程化SQL語句如下:上述過程化SQL語句包括,開始:“BEGIN”、結(jié)束:“END”、如果:“IF”和否則:“ELS”的非標(biāo)準(zhǔn)SQL語句,以及從表格1中選擇:“select*fromtable1”,從表格2中選擇:“select*fromtable2”這兩個(gè)標(biāo)準(zhǔn)SQL語句,代碼示例一的過程化SQL語句表示:用于根據(jù)變量var值是否大于0來決定是從table1還是table2來做查詢。接上例,詞法分析器需要擴(kuò)展為能夠識別關(guān)鍵字BEGIN、END、IF、THEN、ELSE。語法分析器需要擴(kuò)展為能夠識別BEGIN、END、IF、THEN、ELSE等語句的語法結(jié)構(gòu)。擴(kuò)展之后的詞法分析器和語法分析器能夠?qū)⑸侠械倪^程化SQL語句識別,形成圖2所示的中間表示的語法樹。接著,在所述第二裝置12中,對所述中間表示進(jìn)行語義分析,以轉(zhuǎn)化為若干執(zhí)行塊,并逐塊執(zhí)行所述執(zhí)行塊。進(jìn)一步地,在第二裝置12中,還包括:記錄若干所述執(zhí)行塊之間的依賴關(guān)系;基于所述依賴關(guān)系,從起始的執(zhí)行塊起,依次執(zhí)行所述執(zhí)行塊。當(dāng)所述過程化SQL只包括非標(biāo)準(zhǔn)SQL語句時(shí),將過程化SQL語句全部轉(zhuǎn)化為待解釋執(zhí)行的執(zhí)行塊,所述待解釋執(zhí)行的執(zhí)行塊可以包括以下至少任一項(xiàng):賦值語句執(zhí)行塊、控制語句執(zhí)行塊(例如IF/ELSE、GOTO、LOOP、FOR、FORALL、WHILE/CONTINUE/EXIT)、讀取執(zhí)行塊及調(diào)用執(zhí)行塊。當(dāng)所述過程化SQL語句包括非標(biāo)準(zhǔn)SQL語句和標(biāo)準(zhǔn)SQL語句時(shí),對所述過程化SQL語句進(jìn)行語義分析,將所述非標(biāo)準(zhǔn)SQL語句轉(zhuǎn)化為待解釋執(zhí)行的執(zhí)行塊,將所述標(biāo)準(zhǔn)SQL語句轉(zhuǎn)化為標(biāo)準(zhǔn)SQL語句執(zhí)行塊。圖3示出根據(jù)本申請一具體實(shí)施例中的一種用于分布式系統(tǒng)的執(zhí)行過程化SQL語句的執(zhí)行塊示意圖;接上例,將圖2所示的中間表示轉(zhuǎn)化為圖3所示的執(zhí)行塊,其中,包括根執(zhí)行塊、條件判斷執(zhí)行塊、表達(dá)式執(zhí)行塊、標(biāo)準(zhǔn)SQL語句執(zhí)行塊、變量訪問執(zhí)行塊和常量訪問執(zhí)行塊。所述第二裝置12包括:第二一單元121、第二二單元122和第二三單元123。所述第二一單元121用于:對所述過程化SQL語句進(jìn)行語義分析,將所述非標(biāo)準(zhǔn)SQL語句的中間表示轉(zhuǎn)化為待解釋執(zhí)行的執(zhí)行塊,將所述 標(biāo)準(zhǔn)SQL語句的中間表示轉(zhuǎn)化為標(biāo)準(zhǔn)SQL語句執(zhí)行塊;所述第二二單元122用于:解釋執(zhí)行所述待解釋執(zhí)行的執(zhí)行塊;所述第二三單元123用于:將所述標(biāo)準(zhǔn)SQL語句執(zhí)行塊發(fā)送給分布式系統(tǒng)的計(jì)算引擎進(jìn)行執(zhí)行。進(jìn)一步地,在所述第二一單元121還包括:根據(jù)所述過程化SQL語句的中間表示,分析并記錄所述中間表示的屬性,所述屬性包括參量、變量和類型;則在所述第二二單元122根據(jù)所述中間表示的屬性,利用基于棧式的函數(shù)執(zhí)行框架執(zhí)行所述執(zhí)行塊,包括:創(chuàng)建基于棧式的函數(shù)執(zhí)行框架;在所述函數(shù)執(zhí)行框架的棧中分配所述中間表示的屬性;利用所述函數(shù)執(zhí)行框架,逐塊執(zhí)行所述執(zhí)行塊。進(jìn)一步地,所述第二三單元123還包括:分析所述標(biāo)準(zhǔn)SQL語句的中間表示是否用到其他中間表示的變量,若用到,則記錄所述變量的名稱和在標(biāo)準(zhǔn)SQL語句中的位置,并在執(zhí)行到所述標(biāo)準(zhǔn)SQL語句執(zhí)行塊時(shí),先獲取所述變量的值,將所述變量的值替換為常量后存入標(biāo)準(zhǔn)SQL語句執(zhí)行塊。隨后將變量的值替換為常量的標(biāo)準(zhǔn)SQL語句執(zhí)行塊發(fā)送分布式系統(tǒng)的計(jì)算引擎進(jìn)行執(zhí)行。具體地,代碼示例二如下:DeclareVarint:=100BeginSelect*fromTwherecol<varEnd所述代碼示例二描述了一個(gè)整型(int)的變量var,首先定義變量Var為100,開始執(zhí)行從表格T中選擇小于var的數(shù)據(jù)。在第二三單元123中,首先通過語義分析,分析到標(biāo)準(zhǔn)SQL語句“Select*fromTwherecol<var”用到其他中間表示的變量var,記錄變量的名稱為var和在標(biāo)準(zhǔn)SQL語句中的位置為小于號后;在執(zhí)行到所述標(biāo)準(zhǔn)SQL語句執(zhí)行塊時(shí),先獲取所述變量var的值為100(執(zhí)行至此的變量通常都已通過之前執(zhí)行過程獲得值的結(jié)果),將所述變量的值替換為常量100后存入標(biāo)準(zhǔn)SQL語句執(zhí)行 塊(Select*fromTwherecol<var的執(zhí)行塊),隨后將變量的值替換為常量的標(biāo)準(zhǔn)SQL語句執(zhí)行塊發(fā)送分布式系統(tǒng)的計(jì)算引擎進(jìn)行執(zhí)行。通過交由分布式系統(tǒng)的計(jì)算引擎進(jìn)行執(zhí)行,能夠提高數(shù)據(jù)處理效率,進(jìn)而實(shí)現(xiàn)數(shù)據(jù)的實(shí)時(shí)處理,使得用戶可以在數(shù)據(jù)庫層完成復(fù)雜的業(yè)務(wù)邏輯,并且通過與現(xiàn)有過程化SQL語言的語法兼容,使得現(xiàn)有應(yīng)用遷移到大數(shù)據(jù)平臺的成本大幅降低。進(jìn)一步地,所述第二裝置12還包括:第二四單元124,所述第二四單元124用于,將所述分布式系統(tǒng)的計(jì)算引擎所執(zhí)行的結(jié)果存儲于所述分布式系統(tǒng)的存儲裝置,以供后續(xù)執(zhí)行塊讀取使用。例如,游標(biāo)(CURSOR)語句可以用于過程化SQL語句和標(biāo)準(zhǔn)SQL語句之間的數(shù)據(jù)調(diào)用,可以讀取存儲于所述分布式系統(tǒng)的存儲裝置的數(shù)據(jù)。具體地,如以下示例代碼三所示:DeclarecursorCisSelectnamefromT//從T表中選name字段的一列數(shù)據(jù)Var_namestring//定義本地變量BeginOpenC//打開游標(biāo)語句FetchCintovar_name//第一種情況,從游標(biāo)C中獲取一條數(shù)據(jù)到本地的變量Var_name……Putline(var_name)//打印本地的Var_name示例代碼三表示,定義游標(biāo)C表示從T表中選name字段的一列數(shù)據(jù),定義本地變量var_name,開始執(zhí)行打開游標(biāo)C,從游標(biāo)C中獲取一條數(shù)據(jù)到本地變量var_name中,此后本地變量var_name的數(shù)據(jù)。最后可以通過游標(biāo)內(nèi)部的狀態(tài)確定是否已取完。此外,如以下示例代碼四所示:DeclarecursorCisSelectnamefromT//從T表中選name字段的一列數(shù)據(jù)Var_namestring//定義本地變量BeginOpenC//打開游標(biāo)語句FetchCbuckcollectinto本地?cái)?shù)組//從游標(biāo)C中獲取所有數(shù)據(jù)到本地?cái)?shù)組Limit100//最大取100條示例代碼四表示,定義游標(biāo)C表示從T表中選name字段的一列數(shù)據(jù),定義本地變量var_name,開始執(zhí)行打開游標(biāo)C,從游標(biāo)C中獲取所有數(shù)據(jù)到本地?cái)?shù)組,可以限制最大取100條。最后可以通過游標(biāo)內(nèi)部的狀態(tài)確定是否已取完。第二四單元124通過游標(biāo)(CURSOR)語句可以將存儲于分布式系統(tǒng)的存儲裝置中的數(shù)據(jù)讀取,并為后續(xù)執(zhí)行塊在執(zhí)行中使用。當(dāng)然,本領(lǐng)域技術(shù)人員應(yīng)當(dāng)能夠理解,所述第二四單元124通過游標(biāo)讀取分布式系統(tǒng)的存儲裝置中的數(shù)據(jù)的方式僅為舉例,其他能夠讀取方式適用于本申請的,也包含在本申請的思想范圍之內(nèi)。與現(xiàn)有技術(shù)相比,本申請通過提供了用于分布式系統(tǒng)的執(zhí)行過程化SQL語句的方法和設(shè)備,對過程化SQL語句進(jìn)行詞法分析和語法分析,以建立所述過程化SQL語句的中間表示;對所述中間表示進(jìn)行語義分析,以轉(zhuǎn)化為若干執(zhí)行塊;逐塊執(zhí)行所述執(zhí)行塊。本申請所述方法和設(shè)備增強(qiáng)了大數(shù)據(jù)平臺上的SQL語言表達(dá)能力,使得用戶可以在數(shù)據(jù)庫層完成復(fù)雜的業(yè)務(wù)邏輯。通過與現(xiàn)有過程化SQL語言的語法兼容,使得現(xiàn)有應(yīng)用遷移到大數(shù)據(jù)平臺的成本大幅降低。需要注意的是,本申請可在軟件和/或軟件與硬件的組合體中被實(shí)施,例如,可采用專用集成電路(ASIC)、通用目的計(jì)算機(jī)或任何其他類似硬件設(shè)備來實(shí)現(xiàn)。在一個(gè)實(shí)施例中,本申請的軟件程序可以通過處理器執(zhí)行以實(shí)現(xiàn)上文所述步驟或功能。同樣地,本申請的軟件程序(包括相關(guān)的數(shù)據(jù)結(jié)構(gòu))可以被存儲到計(jì)算機(jī)可讀記錄介質(zhì)中,例如,RAM存儲器,磁或光驅(qū)動器或軟磁盤及類似設(shè)備。另外,本申請的一些步驟或功能可采用硬件來實(shí)現(xiàn),例如,作為與處理器配合從而執(zhí)行各個(gè)步驟或功能的電路。另外,本申請的一部分可被應(yīng)用為計(jì)算機(jī)程序產(chǎn)品,例如計(jì)算機(jī)程序 指令,當(dāng)其被計(jì)算機(jī)執(zhí)行時(shí),通過該計(jì)算機(jī)的操作,可以調(diào)用或提供根據(jù)本申請的方法和/或技術(shù)方案。而調(diào)用本申請的方法的程序指令,可能被存儲在固定的或可移動的記錄介質(zhì)中,和/或通過廣播或其他信號承載媒體中的數(shù)據(jù)流而被傳輸,和/或被存儲在根據(jù)所述程序指令運(yùn)行的計(jì)算機(jī)設(shè)備的工作存儲器中。在此,根據(jù)本申請的一個(gè)實(shí)施例包括一個(gè)裝置,該裝置包括用于存儲計(jì)算機(jī)程序指令的存儲器和用于執(zhí)行程序指令的處理器,其中,當(dāng)該計(jì)算機(jī)程序指令被該處理器執(zhí)行時(shí),觸發(fā)該裝置運(yùn)行基于前述根據(jù)本申請的多個(gè)實(shí)施例的方法和/或技術(shù)方案。對于本領(lǐng)域技術(shù)人員而言,顯然本申請不限于上述示范性實(shí)施例的細(xì)節(jié),而且在不背離本申請的精神或基本特征的情況下,能夠以其他的具體形式實(shí)現(xiàn)本申請。因此,無論從哪一點(diǎn)來看,均應(yīng)將實(shí)施例看作是示范性的,而且是非限制性的,本申請的范圍由所附權(quán)利要求而不是上述說明限定,因此旨在將落在權(quán)利要求的等同要件的含義和范圍內(nèi)的所有變化涵括在本申請內(nèi)。不應(yīng)將權(quán)利要求中的任何附圖標(biāo)記視為限制所涉及的權(quán)利要求。此外,顯然“包括”一詞不排除其他單元或步驟,單數(shù)不排除復(fù)數(shù)。裝置權(quán)利要求中陳述的多個(gè)單元或裝置也可以由一個(gè)單元或裝置通過軟件或者硬件來實(shí)現(xiàn)。第一,第二等詞語用來表示名稱,而并不表示任何特定的順序。當(dāng)前第1頁1 2 3 當(dāng)前第1頁1 2 3