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