- 相關(guān)推薦
GKD-BASE PL/SQL引擎實(shí)現(xiàn)關(guān)鍵技術(shù)研究
摘要:在數(shù)據(jù)庫管理系統(tǒng)GKD-BASE上設(shè)計并實(shí)現(xiàn)了兼容Oracle PL/SQL V2.3語言規(guī)范的PL/SQL引擎,擴(kuò)展了GKD-BASE過程處理功能。GKD-BASE數(shù)據(jù)庫是一個具有自主知識產(chǎn)權(quán)的數(shù)據(jù)庫管理系統(tǒng),具有兼容SQL89標(biāo)準(zhǔn)的SQL引擎,能夠?yàn)橛脩籼峁┮粋統(tǒng)一、有效的數(shù)據(jù)庫訪問接口,實(shí)現(xiàn)對數(shù)據(jù)庫的各種操作。但是SQL語言缺乏對算法的描述能力,難以勝任復(fù)雜的程序設(shè)計。為了融合SQL語言強(qiáng)大的集合數(shù)據(jù)處理能力和第三代語言(3GL)靈活的過程處理能力,主流數(shù)據(jù)庫管理系統(tǒng)產(chǎn)品都已提供了對過程式SQL語言的支持,如Oracle的PL/SQL[1]。為了使GKD-BASE適應(yīng)發(fā)展現(xiàn)狀,滿足管理人員和開發(fā)人員的需求,急需開發(fā)GKD-BASE自身的PL/SQL引擎。
本文在數(shù)據(jù)庫管理系統(tǒng)GKD-BASE上設(shè)計并實(shí)現(xiàn)了兼容Oracle PL/SQL V2.3語言規(guī)范的PL/SOL引擎,擴(kuò)展了GKD-BASE過程處理功能。
1 GKD-BASE PL/SQL引擎的體系結(jié)構(gòu)
GKD-BASE PL/SQL引擎的基本功能是將用戶用PL/SQL語言編寫的程序通過詞法分析程序、語法分析程序進(jìn)行解析,生成中間代碼并解釋執(zhí)行。如果在分析階段或解釋執(zhí)行階段發(fā)現(xiàn)錯誤,則向用戶報告錯誤號及相應(yīng)的錯誤信息,以便用戶排錯[2]。根據(jù)PL/SQL語言兼有過程式語句和SQL語句的特點(diǎn),采取分治策略,把過程語句和SQL語句分開處理。PL/SQL引擎在對PL/SQL源程序編譯執(zhí)行時,首先進(jìn)行預(yù)處理,把SQL語句和過程語句分開;然后對SQL語句和過程語句分別解析,生成語法樹;最后通過執(zhí)行模塊對中間代碼進(jìn)行解釋執(zhí)行。
圖1
GKD-BASE PL/SQL引擎對源程序編譯生成中間代碼,不能直接在目標(biāo)機(jī)器上執(zhí)行,需要一個解釋中間代碼的環(huán)境,以提供對PL/SQL語言中的數(shù)據(jù)類型的支持,保證PL/SQL正確執(zhí)行。因此GKD-BASE PL/SQL引擎可分為編譯器和解釋器兩部分,如圖1。編譯器接收到PL/SQL語句塊后進(jìn)行預(yù)處理,將句子分為SQL語句和過程語句。對于SQL語句,編譯器建立SQL語句節(jié)點(diǎn),進(jìn)行相應(yīng)的變量綁定和語法檢查;檢查無誤后產(chǎn)生中間代碼。對于過程語句,編譯器對語句成分進(jìn)行語法分析并建立相應(yīng)的符號表,也生成中間代碼。因此,可以把編譯器劃分為SQL語言解析、過程語言解析、符號表生成與管理、中間代碼表示與管理等模塊。解釋器的作用是對編譯器生成的中間代碼進(jìn)行解釋執(zhí)行[3],與編譯器對應(yīng),具有獨(dú)立的SQL語句解釋模塊和過程語句解釋模塊。解釋器還包括執(zhí)行狀態(tài)堆棧的管理、與GKD-BASESQL引擎的調(diào)用接口。異常處理模塊主要實(shí)現(xiàn)程序運(yùn)行時的錯誤檢查和報告,并支持用戶自定義異常和預(yù)定義異常的檢查和處理。
2 GKD-BASE PL/SQL編譯器實(shí)現(xiàn)中的一些關(guān)鍵問題
GKD-BASE PL/SQL編譯器主要是對PL/SQL源程序進(jìn)行詞法分析、語法分析和語義處理[4]。本文借助構(gòu)建詞法分析器的Lex和編譯程序自動產(chǎn)生工具Yacc[5],實(shí)現(xiàn)了對PL/SQL源程序的編譯。下面分別說明符號表的設(shè)計與管理、SQL語句解析以及游標(biāo)解析。
2.1 符號表的設(shè)計與管理
符號表是一個包含程序中的變量、自定義類型和函數(shù)信息的數(shù)據(jù)庫。通過索引對應(yīng)于庫中的一條記錄;每條記錄對應(yīng)著一個對象的信息,如變量的類型或函數(shù)的返回值等[2]。
考慮到PL/SQL語言的塊結(jié)構(gòu)和名字作用域,可以使用名字堆棧存放源程序中所使用的標(biāo)志符的索引、名字和類型。每個項(xiàng)目只包括名字本身和用來表明它的類型的標(biāo)志值,以及該名字在符號表中的項(xiàng)目索引。名字堆棧采用層次結(jié)構(gòu),是鏈表型的堆棧,堆棧的每一層存放了解析的語句塊嵌套層內(nèi)的所有名字信息,如圖2。在進(jìn)入或退出一個嵌套層時調(diào)用相應(yīng)的壓棧和彈棧操作;查找符號時,從棧頂向棧底搜索。名字堆棧實(shí)現(xiàn)了標(biāo)志符名稱與相應(yīng)的符號表索引間的映射,解決了標(biāo)志符的作用域問題和可見性問題,滿足了對符號表管理和調(diào)用的要求。
2.2 SQL語句的解析
為了避免SQL語句在執(zhí)行時出現(xiàn)語法錯誤,需要提前檢查其語法的正確性。SQL語句是面向集合的數(shù)據(jù)操作語言,只能交由SQL引擎處理。但是PL/SQL語言為了增強(qiáng)SQL語句與過程式語句的交互能力,在SQL語句中引入變量,GKD-BASE的SQL引擎無法識別,必須在提交之前提取出變量,替換為SQL引擎可以識別的格式。如:SELECT empno,name INTO v_empno, v_name FROM empWHERE birthday=v_date;
這個SELECT語句首先把變量v_date綁定到列名birthday,然后根據(jù)條件查出相應(yīng)的結(jié)果 (empno,name),并賦值給預(yù)先定義的變量(v_empno,v_name)。對于GKD-BASE的SQL引擎來說,只能識別出如下格式的SELECT語句:
SELECT empno,name INTO:v_empno,:v_nameFROM emp WHERE birthday=:1;
在把SQL語句交由GKD-BASE SQL引擎處理之前,識別出變量v_empno、v_name及v_date進(jìn)行格式轉(zhuǎn)換,在into之后的變量前面添加“:”,where后面的變量用帶有冒號的數(shù)字序號代替,構(gòu)造出符合SQL引擎要求的語句;完成這些處理之后,把新的語句作為字符串交由SQL引擎進(jìn)行語法分析,檢查這條語句的語法是否正確,以及語句中的變量與對應(yīng)的列是否匹配;最后返回結(jié)果,報錯或者生成語法樹。
2.3 游標(biāo)的解析
游標(biāo)是指向內(nèi)存中上下文區(qū)的句柄或指針。借助于游標(biāo),PL/SQL程序可以控制上下文區(qū)和語句處理過程中游標(biāo)的變化。PL/SQL游標(biāo)按使用方式可以分為顯式游標(biāo)和隱式游標(biāo)。
顯式游標(biāo)的使用包括聲明游標(biāo)、打開游標(biāo)、游標(biāo)檢索、關(guān)閉游標(biāo)四個步驟。編譯游標(biāo)聲明語句時,首先調(diào)用SQL引擎分析SQL語句成分,轉(zhuǎn)換為SQL引擎可以識別的格式,把游標(biāo)的索引信息加入名字堆棧和
【GKD-BASE PL/SQL引擎實(shí)現(xiàn)關(guān)鍵技術(shù)研究】相關(guān)文章:
搜索引擎檢索子系統(tǒng)的設(shè)計與實(shí)現(xiàn)ASP+SQL11-23
排課系統(tǒng)的實(shí)現(xiàn)Delphi+SQL11-23
CPM搜索引擎的設(shè)計與實(shí)現(xiàn)03-08
美容網(wǎng)站的設(shè)計與實(shí)現(xiàn)JSP+SQL03-08
網(wǎng)絡(luò)購物系統(tǒng)的設(shè)計與實(shí)現(xiàn)ASP+SQL03-08
購物網(wǎng)站的設(shè)計與實(shí)現(xiàn)ASP+SQL03-08
基于JSP的BBS設(shè)計與實(shí)現(xiàn)JSP+SQL03-08