《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 業(yè)界動(dòng)態(tài) > GKD-Base PL/SQL存儲(chǔ)函數(shù)實(shí)現(xiàn)的關(guān)鍵技術(shù)研究

GKD-Base PL/SQL存儲(chǔ)函數(shù)實(shí)現(xiàn)的關(guān)鍵技術(shù)研究

2008-10-24
作者:高朝瑞 熊偉 陳宏盛  翟玉人

  摘 要: 介紹具有自主知識(shí)產(chǎn)權(quán)的某安全數(shù)據(jù)庫管理系統(tǒng)" title="管理系統(tǒng)">管理系統(tǒng)GKD-Base" title="GKD-Base">GKD-Base的PL/SQL引擎,基于該引擎研究GKD-Base存儲(chǔ)函數(shù)機(jī)制實(shí)現(xiàn)的關(guān)鍵技術(shù)。設(shè)計(jì)了函數(shù)管理器" title="管理器">管理器和執(zhí)行狀態(tài)堆棧,通過語法樹表示存儲(chǔ)函數(shù)編譯后生成的中間代碼,并解決了中間代碼的執(zhí)行問題。最后實(shí)現(xiàn)了IN、OUT、INOUT三種參數(shù)模式函數(shù)的參數(shù)傳遞機(jī)制。
  關(guān)鍵詞: 存儲(chǔ)函數(shù) 過程式SQL語言 PL/SQL 函數(shù)管理器 執(zhí)行狀態(tài)堆棧


  GKD-Base是一個(gè)具有自主知識(shí)產(chǎn)權(quán)的安全數(shù)據(jù)庫管理系統(tǒng)。經(jīng)過十幾年的發(fā)展和試點(diǎn)應(yīng)用,已經(jīng)證明該系統(tǒng)是穩(wěn)定和安全可靠的。但是,隨著應(yīng)用需求向深度和廣度的發(fā)展,GKD-Base在很多方面暴露出不足,如不支持過程式SQL語言、不支持存儲(chǔ)過程和函數(shù)、缺少觸發(fā)器功能,這都為GKD-Base數(shù)據(jù)庫管理系統(tǒng)的進(jìn)一步推廣應(yīng)用帶來了不小的障礙。由于目前數(shù)據(jù)庫管理系統(tǒng)產(chǎn)品大都支持過程式的SQL語言,如Oracle的PL/SQL、SQL Server的T-SQL、PostgreSQL的PL/pgSQL等,其中又以O(shè)racle的PL/SQL使用最為廣泛。因此,為使GKD-Base適應(yīng)應(yīng)用需求的發(fā)展,滿足數(shù)據(jù)庫管理和開發(fā)人員的需求,筆者開發(fā)了GKD-Base PL/SQL引擎,進(jìn)而在引擎的基礎(chǔ)上實(shí)現(xiàn)了GKD-Base存儲(chǔ)函數(shù)機(jī)制。GKD-Base PL/SQL引擎兼容了Oracle PL/SQL V2.3語言規(guī)范,可以使用變量、類型、表達(dá)式、條件和循環(huán)、過程和函數(shù)等過程式語言中的通用機(jī)制進(jìn)行程序設(shè)計(jì),同時(shí)也可以使用SQL 語句進(jìn)行數(shù)據(jù)操作。
  存儲(chǔ)函數(shù)是獨(dú)立存在于表之外的數(shù)據(jù)庫對(duì)象,是由用戶按照存儲(chǔ)函數(shù)語言規(guī)范編寫的經(jīng)過數(shù)據(jù)庫分析和編譯的PL/SQL程序,它有輸入/輸出參數(shù)和返回值,可以被其它應(yīng)用程序調(diào)用。存儲(chǔ)函數(shù)可以避免重復(fù)編碼,具有更高的可靠性和效率,是數(shù)據(jù)庫管理系統(tǒng)的重要功能擴(kuò)充。本文在介紹GKD-Base PL/SQL引擎設(shè)計(jì)框架的基礎(chǔ)上,重點(diǎn)探討GKD-Base存儲(chǔ)函數(shù)實(shí)現(xiàn)的關(guān)鍵技術(shù)。
1 GKD-Base PL/SQL引擎的體系結(jié)構(gòu)
  GKD-Base采用客戶服務(wù)器結(jié)構(gòu),以多線程機(jī)制支持客戶訪問,登錄到數(shù)據(jù)庫的用戶實(shí)際上是運(yùn)行數(shù)據(jù)庫管理系統(tǒng)映像的一個(gè)線程。GKD-Base支持TCP/IP協(xié)議,客戶可以在任何TCP/IP網(wǎng)絡(luò)和服務(wù)器建立連接訪問數(shù)據(jù)庫。GKD-Base API提供了用戶應(yīng)用、實(shí)用程序和第三方開發(fā)工具三種接入數(shù)據(jù)庫的方式,并提供了兩個(gè)級(jí)別的接口,即GKD-Base內(nèi)部接口GKD-API和GKD-Base ODBC Driver。GKD-API是用戶訪問數(shù)據(jù)庫的高效調(diào)用方式,用戶可利用GKD-API實(shí)現(xiàn)實(shí)時(shí)性要求較高的數(shù)據(jù)庫應(yīng)用,起到比較理想的效果。GKD-Base ODBC Driver是GKD-Base開放連接的手段,符合ODBC擴(kuò)展一級(jí)。在GKD-Base的ODBC驅(qū)動(dòng)程序支持下,用戶可利用各種第三方開發(fā)工具,方便地開發(fā)GKD-Base數(shù)據(jù)庫應(yīng)用程序。
  GKD-Base PL/SQL引擎應(yīng)用模式如圖1。PL/SQL語句塊通過PL/SQL編譯器編譯成語法樹形式表示的中間代碼,中間代碼信息可以保存在DBMS的中間代碼庫中。客戶應(yīng)用程序中的請(qǐng)求由GKD-Base預(yù)處理器分離成為過程語句部分和SQL命令部分。過程語句解釋執(zhí)行器" title="執(zhí)行器">執(zhí)行器解釋執(zhí)行過程語句的中間代碼,SQL命令則直接調(diào)用GKD-API執(zhí)行。


  根據(jù)PL/SQL語言兼有過程式語句和SQL語句的特點(diǎn),GKD-Base PL/SQL引擎把過程式語句和SQL語句分開處理。為了降低引擎實(shí)現(xiàn)的復(fù)雜程度,盡可能地從功能性的角度將整個(gè)引擎劃分為不同的處理模塊,每個(gè)處理模塊盡可能地降低相互間的耦合程度。其中最主要的劃分是將整個(gè)引擎劃分為前端編譯器和后端解釋執(zhí)行器。
  前端編譯器包括語言預(yù)處理、SQL語句分析、過程語句分析以及中間代碼生成等功能。PL/SQL語句塊輸入后,由語言預(yù)處理功能分離成SQL語句和過程語句。對(duì)于SQL語句,由GKD-Base SQL引擎解析后,建立SQL語句結(jié)點(diǎn),進(jìn)行相應(yīng)的變量綁定和語法檢查,檢查無誤后產(chǎn)生語法樹形式的中間代碼。對(duì)于過程語句,將語句成分進(jìn)行語法分析,在分析中把聲明的變量和數(shù)據(jù)類型加入到符號(hào)表中,同時(shí)也產(chǎn)生語法樹形式的中間代碼。
  后端解釋執(zhí)行器的功能就是對(duì)前端編譯器生成的中間代碼進(jìn)行解釋執(zhí)行。因此在結(jié)構(gòu)上,解釋執(zhí)行器與編譯器對(duì)應(yīng),也有過程語句執(zhí)行模塊和SQL語句執(zhí)行模塊。過程語句解釋執(zhí)行器解釋執(zhí)行過程語句的中間代碼,SQL命令則直接由SQL引擎執(zhí)行。另外,解釋器還包括例外處理模塊,負(fù)責(zé)錯(cuò)誤檢查和報(bào)告。
  符號(hào)表是一個(gè)包含程序中的變量、自定義類型和函數(shù)信息的數(shù)據(jù)庫,它是GKD-Base PL/SQL引擎的核心數(shù)據(jù)結(jié)構(gòu)。它以一個(gè)關(guān)鍵字域(通常是一個(gè)符號(hào)的名字)為索引,一個(gè)關(guān)鍵字域的值對(duì)應(yīng)于庫中的一條記錄。每條記錄,即數(shù)據(jù)庫的一個(gè)項(xiàng)目,都對(duì)應(yīng)著一個(gè)符號(hào)的信息,如變量的類型或函數(shù)的返回值等。
2 GKD-Base PL/SQL過程與函數(shù)語言成分設(shè)計(jì)
  子程序" title="子程序">子程序把功能獨(dú)立并需要反復(fù)用到的代碼加以參數(shù)化處理,從而整合為一個(gè)命名模塊,在要使用這個(gè)模塊時(shí)就傳入具體參數(shù)值(如果需要)進(jìn)行調(diào)用。與第三代語言中的子程序一樣,GKD-Base PL/SQL過程與函數(shù)是特定功能的邏輯抽象,由子程序定義和引用組成,可以分為過程和函數(shù)兩種類別。PL/SQL子程序可以分開編譯并存儲(chǔ)到數(shù)據(jù)庫中,用CREATE 語句建立,并成為模式對(duì)象的一部分。存儲(chǔ)過程/函數(shù)可以位于包結(jié)構(gòu)中,包分為包聲明和包體實(shí)現(xiàn)部分。本地過程/函數(shù)在DECLARE 節(jié)中的最后部分進(jìn)行,而作為存儲(chǔ)過程和存儲(chǔ)函數(shù)將存儲(chǔ)在數(shù)據(jù)庫中,它們是命名的PL/SQL塊。這樣它們?cè)诮Y(jié)構(gòu)上也就沒有特別之處了。下面主要討論形參和實(shí)參的綁定設(shè)計(jì)。
  PL/SQL 函數(shù)中的參數(shù)說明帶有輸入和輸出描述,需要在編譯時(shí)刻進(jìn)行處理,并對(duì)調(diào)用時(shí)的參數(shù)類型是否相容進(jìn)行檢查。但在PL/SQL過程和函數(shù)的聲明中,限制CHAR、VARCHAR2參數(shù)的長度以及限制NUMBER的精度都是非法的。這是由于在調(diào)用一個(gè)函數(shù)時(shí),實(shí)際參數(shù)的取值被傳遞進(jìn)去,在函數(shù)內(nèi)部通過使用形式參數(shù)來引用這些實(shí)際參數(shù),不僅實(shí)際數(shù)值被傳遞進(jìn)去,而且作為參數(shù)傳遞機(jī)制的一部分,對(duì)于這些變量的限制也被傳遞進(jìn)去。例如:
  創(chuàng)建函數(shù):
  CREATE OR REPLACE FUNCTION ParameterLength (p_Var1 IN OUT VARCHAR2)
  RETURN VARCHAR2 AS
  BEGIN
    p_Var1:=′This is an example′;
    RETURN p_Var1; 
  END ParameterLength;
  調(diào)用函數(shù):
  DECLARE
  v_Variable1 VARCHAR (30);
  v_Variable2 VARCHAR (30);
  BEGIN
    v_Variable2:= ParameterLength (v_Variable1);
  END;
  上述調(diào)用將使p_Var1變量的最大長度為30(來自實(shí)參)。而如果將v_Variable1的長度定義成10,將產(chǎn)生錯(cuò)誤。這個(gè)錯(cuò)誤的產(chǎn)生不是過程設(shè)計(jì)不好,而是因?yàn)檎{(diào)用該過程的代碼發(fā)生了問題。值得注意的是:在過程定義中如果使用%TYPE作為形參類型的限制,而基準(zhǔn)類型又是受限的,那么該限制將作用于形式參數(shù)而不是實(shí)際參數(shù)。
  在缺省參數(shù)值的處理方式上,即當(dāng)調(diào)用時(shí),沒有指明實(shí)際值時(shí),就用缺省值。對(duì)使用缺省值的形式參數(shù),通常需要把它們放到參數(shù)表的末尾,這樣無論使用位置標(biāo)識(shí)法還是帶名標(biāo)識(shí)法都可以。
3 GKD-Base存儲(chǔ)函數(shù)實(shí)現(xiàn)的關(guān)鍵技術(shù)
3.1函數(shù)管理器

  GKD-Base PL/SQL引擎對(duì)PL/SQL程序的解釋執(zhí)行都通過一個(gè)內(nèi)部統(tǒng)一的入口,解釋器把語法樹載入到入口內(nèi)部的一個(gè)默認(rèn)的主控函數(shù),由這個(gè)函數(shù)驅(qū)動(dòng)對(duì)其解釋執(zhí)行。這樣處理的主要目的是為了兼容子程序的語法分析和保持解釋器運(yùn)轉(zhuǎn)機(jī)制的一致性。因?yàn)樽映绦蚓褪荘L/SQL程序中命名的語句塊,用戶調(diào)用子程序時(shí),PL/SQL引擎可以再次調(diào)用內(nèi)部主控函數(shù)對(duì)其進(jìn)行處理,并提交解釋器執(zhí)行。
  PL/SQL子程序包括局部聲明子程序和存儲(chǔ)子程序。為了管理和調(diào)用局部聲明子程序,設(shè)計(jì)了函數(shù)管理器,如圖2。函數(shù)管理器內(nèi)部定義了一系列數(shù)據(jù)結(jié)構(gòu)來描述局部聲明子程序調(diào)用的各種屬性,提供各種宏調(diào)用來獲取局部聲明子程序調(diào)用的參數(shù)和返回值,并提供必要的支持函數(shù)。從某種角度看,函數(shù)管理器也是用來存放各種局部聲明函數(shù)和過程信息的“符號(hào)表”,因?yàn)樵诠芾砥髦羞€包括對(duì)聲明子程序聲明和調(diào)用信息的存儲(chǔ)、查找等功能。函數(shù)管理器提供一種結(jié)構(gòu)化的處理手段,以一種統(tǒng)一的方式實(shí)現(xiàn)對(duì)局部聲明子程序的調(diào)用。這種“統(tǒng)一”表現(xiàn)在:每個(gè)局部聲明子程序都在函數(shù)管理器中獲得一個(gè)識(shí)別號(hào)(Oid),這個(gè)識(shí)別號(hào)唯一標(biāo)識(shí)該局部聲明子程序;函數(shù)管理器維持一份記錄表格,其中存放所有局部聲明子程序的識(shí)別號(hào)、子程序名、子程序地址、參數(shù)個(gè)數(shù)和返回值類型等信息,同時(shí)接口還提供相應(yīng)的查找功能,源程序中的局部聲明子程序調(diào)用會(huì)被轉(zhuǎn)換成為子程序的識(shí)別號(hào)并通過該識(shí)別號(hào)查找得到子程序的詳細(xì)信息。


  所有局部聲明子程序都在函數(shù)管理器中進(jìn)行注冊(cè),存儲(chǔ)子程序并不在函數(shù)管理器中注冊(cè),而是保存在數(shù)據(jù)庫中。對(duì)于一個(gè)子程序調(diào)用,首先根據(jù)子程序名到函數(shù)管理器中查找;如果沒有在函數(shù)管理器中找到再去查找數(shù)據(jù)庫,這樣就兼容了Oracle PL/SQL V2.3局部聲明子程序的定義優(yōu)先于存儲(chǔ)子程序的規(guī)則。
3.2 執(zhí)行狀態(tài)堆棧
  在GKD-Base PL/SQL引擎的解釋執(zhí)行器中,設(shè)計(jì)了一個(gè) “執(zhí)行狀態(tài)”的數(shù)據(jù)結(jié)構(gòu),其中記載了存儲(chǔ)函數(shù)的執(zhí)行狀態(tài)信息,如函數(shù)中的聲明變量、函數(shù)的參數(shù)個(gè)數(shù)、函數(shù)的參數(shù)類型、函數(shù)每個(gè)參數(shù)的值、函數(shù)的返回值等。解釋器中所有的解釋函數(shù)都擁有一個(gè)指針參數(shù)指向這個(gè)結(jié)構(gòu),需要在這些函數(shù)間傳遞的信息(包括全局變量信息)將被拷貝到這個(gè)結(jié)構(gòu)??紤]到存儲(chǔ)函數(shù)是個(gè)單獨(dú)的PL/SQL語句塊層次,因此設(shè)計(jì)了執(zhí)行狀態(tài)堆棧。在調(diào)用存儲(chǔ)函數(shù)前,對(duì)當(dāng)前的現(xiàn)場進(jìn)行保存,也就是將當(dāng)前的執(zhí)行狀態(tài)壓棧;在存儲(chǔ)函數(shù)調(diào)用結(jié)束之后恢復(fù)保存的現(xiàn)場,彈出當(dāng)前執(zhí)行狀態(tài),回到上一層執(zhí)行狀態(tài)繼續(xù)執(zhí)行,如圖3。


3.3 存儲(chǔ)函數(shù)的創(chuàng)建和調(diào)用
  用戶創(chuàng)建的存儲(chǔ)函數(shù)經(jīng)過編譯得到中間代碼并保存在GKD-Base的中間代碼庫中。函數(shù)調(diào)用時(shí),根據(jù)函數(shù)名到GKD-Base的中間代碼庫中查找相應(yīng)存儲(chǔ)函數(shù)的中間代碼對(duì)其解釋執(zhí)行,最后得到返回值。GKD-Base存儲(chǔ)函數(shù)的創(chuàng)建和調(diào)用分別對(duì)應(yīng)中間代碼的產(chǎn)生和執(zhí)行過程。
  PL/SQL引擎對(duì)存儲(chǔ)函數(shù)的創(chuàng)建的具體處理過程如下:
 ?、倬幾g器得到用戶創(chuàng)建的存儲(chǔ)函數(shù);
 ?、趯?duì)用戶創(chuàng)建的存儲(chǔ)過程進(jìn)行編譯,如果編譯通過則生成該存儲(chǔ)函數(shù)的語法樹;否則向用戶報(bào)告錯(cuò)誤;
  ③將存儲(chǔ)函數(shù)中間代碼保存在中間代碼庫中;存儲(chǔ)函數(shù)的源代碼保存在GKD-Base的系統(tǒng)表中,如表1;
  ④向用戶返回消息。
  根據(jù)Oracle PL/SQL V2.3 語言規(guī)范,存儲(chǔ)函數(shù)調(diào)用本身不是一個(gè)語句,它只能作為其它語句的一部分。PL/SQL引擎對(duì)存儲(chǔ)函數(shù)的調(diào)用的具體過程如圖4:
 ?、俳忉屍髦姓Z句鏈的解釋函數(shù)調(diào)用存儲(chǔ)函數(shù)的解釋函數(shù);
 ?、诮忉屍髟趫?zhí)行存儲(chǔ)函數(shù)之前,對(duì)當(dāng)前的現(xiàn)場進(jìn)行保存,即將當(dāng)前的執(zhí)行狀態(tài)壓棧;
 ?、鄣綌?shù)據(jù)庫的中間代碼庫中找到存儲(chǔ)函數(shù)的語法樹,把存儲(chǔ)函數(shù)的語法樹掛在整個(gè)PL/SQL語句塊語法樹的過程調(diào)用節(jié)點(diǎn)上,并提交解釋器;
 ?、芙忉屍鲌?zhí)行存儲(chǔ)函數(shù)中間代碼;
 ?、萁忉屍髟诖鎯?chǔ)函數(shù)調(diào)用結(jié)束后,將返回值返回給調(diào)用它的語句,并恢復(fù)保存的現(xiàn)場,彈出當(dāng)前執(zhí)行狀態(tài),回到上一層執(zhí)行狀態(tài)繼續(xù)執(zhí)行。


3.4 存儲(chǔ)函數(shù)的參數(shù)傳遞機(jī)制
  上述存儲(chǔ)函數(shù)調(diào)用過程中的一個(gè)主要難點(diǎn)就是實(shí)際參數(shù)和形式參數(shù)之間值的傳遞。與其它第三代語言一樣,用戶可以創(chuàng)建帶參數(shù)的PL/SQL存儲(chǔ)函數(shù)。這些參數(shù)可以通過值進(jìn)行傳遞,也可以通過引用進(jìn)行傳遞。
  GKD-Base PL/SQL引擎對(duì)存儲(chǔ)函數(shù)的形式參數(shù)的處理與對(duì)變量的處理是一致的,每個(gè)形式參數(shù)的屬性信息對(duì)應(yīng)著符號(hào)表中的一條記錄,形式參數(shù)的名字信息保存在相應(yīng)的名字堆棧層次內(nèi)。如本文第三部分所述,存儲(chǔ)函數(shù)的語法樹也是由解釋器載入到一個(gè)內(nèi)部默認(rèn)的主控函數(shù),由這個(gè)函數(shù)驅(qū)動(dòng)對(duì)其解釋執(zhí)行。解釋器內(nèi)部的主控函數(shù)驅(qū)動(dòng)存儲(chǔ)函數(shù)中所有變量的初始化,也驅(qū)動(dòng)實(shí)際參數(shù)和形式參數(shù)之間值的傳遞。編譯器解析過程調(diào)用語句得到實(shí)際參數(shù)信息,首先判斷實(shí)際參數(shù)和形式參數(shù)的數(shù)據(jù)類型是否匹配,經(jīng)過類型檢查后,如果實(shí)際參數(shù)是常量或普通變量,直接將實(shí)際參數(shù)的值拷貝給形式參數(shù);如果實(shí)際參數(shù)是表達(dá)式,計(jì)算表達(dá)式的值傳給形式參數(shù);如果存儲(chǔ)函數(shù)的形式參數(shù)個(gè)數(shù)大于解析得到的實(shí)際參數(shù)個(gè)數(shù),二者之差為n,那么前面的形式參數(shù)取實(shí)際參數(shù)的值,后n個(gè)形式參數(shù)取語法樹中對(duì)應(yīng)的缺省值。
  在Oracle PL/SQL V2.3中,存儲(chǔ)函數(shù)的形式參數(shù)有三種模式:IN、OUT或INOUT。當(dāng)調(diào)用函數(shù)時(shí),對(duì)IN參數(shù),實(shí)際參數(shù)的值傳遞給過程,函數(shù)結(jié)束后,實(shí)際參數(shù)沒有被改變;對(duì)OUT參數(shù),實(shí)際參數(shù)的任何值都被忽略,形式參數(shù)有一個(gè)NULL值,函數(shù)結(jié)束后,形式參數(shù)的內(nèi)容賦給實(shí)際參數(shù);對(duì)INOUT參數(shù),實(shí)際參數(shù)的值傳遞給過程,函數(shù)結(jié)束后,形式參數(shù)的內(nèi)容賦給實(shí)際參數(shù)。同時(shí)在存儲(chǔ)函數(shù)內(nèi)部,對(duì)IN參數(shù)賦值和把OUT參數(shù)賦給局部變量都是非法操作。
  在GKD-Base PL/SQL引擎中實(shí)現(xiàn)存儲(chǔ)函數(shù)三種形式參數(shù)模式的關(guān)鍵是執(zhí)行前后實(shí)際參數(shù)和形式參數(shù)的值的相互正確傳遞。在執(zhí)行存儲(chǔ)函數(shù)中間代碼前,判斷每個(gè)形式參數(shù)的模式,如果參數(shù)模式是IN或INOUT,直接把實(shí)際參數(shù)的值傳遞給形式參數(shù);如果模式是OUT,直接賦給形式參數(shù)一個(gè)初始的NULL值。對(duì)函數(shù)執(zhí)行體內(nèi)的賦值語句進(jìn)行判斷檢查,如果賦值目標(biāo)是IN參數(shù)或把OUT參數(shù)賦給其它變量,都報(bào)告相應(yīng)的執(zhí)行錯(cuò)誤。函數(shù)執(zhí)行結(jié)束后,解釋器彈出當(dāng)前執(zhí)行狀態(tài),回到上一層執(zhí)行狀態(tài)繼續(xù)執(zhí)行。對(duì)IN參數(shù),實(shí)際參數(shù)直接取其本身的值,即實(shí)際參數(shù)沒有改變;對(duì)OUT參數(shù)和INOUT參數(shù),根據(jù)執(zhí)行前形式參數(shù)和實(shí)際參數(shù)的對(duì)應(yīng)關(guān)系,用執(zhí)行完畢后的形式參數(shù)的值替代原來實(shí)際參數(shù)的值,即執(zhí)行完后形式參數(shù)的內(nèi)容賦給實(shí)際參數(shù)。
  PL/SQL 集成了一般過程式語言和說明性SQL 語言的特點(diǎn),簡潔、高效,而其內(nèi)容卻十分豐富。這也從一個(gè)方面說明了作為過程式數(shù)據(jù)庫編程語言,在考慮到底層數(shù)據(jù)庫功能時(shí)所面臨的各種選擇的艱難。PL/SQL 語言的某些功能將隨著ORACLE 數(shù)據(jù)庫的發(fā)展而繼續(xù)增強(qiáng),但是該語言的結(jié)構(gòu)是基本穩(wěn)定的。本文參照Oracle PL/SQL V2.3 語言規(guī)范,在某安全數(shù)據(jù)庫管理系統(tǒng)GKD-Base上開發(fā)了PL/SQL引擎作為該系統(tǒng)的重要擴(kuò)充,并在該引擎基礎(chǔ)上實(shí)現(xiàn)了GKD-Base存儲(chǔ)函數(shù)機(jī)制,提供給用戶一種高效率的編程手段,增強(qiáng)了GKD-Base的功能。希望本文實(shí)現(xiàn)的PL/SQL引擎能對(duì)國產(chǎn)數(shù)據(jù)庫的開發(fā)起到借鑒作用。當(dāng)然PL/SQL 語言內(nèi)容十分豐富,本文不可能涉及到每一個(gè)設(shè)計(jì)細(xì)節(jié),PL/SQL 還在進(jìn)一步發(fā)展,值得繼續(xù)關(guān)注。
  為了進(jìn)一步擴(kuò)展GKD-Base在安全保密領(lǐng)域的應(yīng)用前景,筆者將在對(duì)GKD-Base本身進(jìn)一步完善的同時(shí),繼續(xù)對(duì)GKD-Base PL/SQL引擎進(jìn)行完善和改進(jìn)。一方面在功能上實(shí)現(xiàn)封裝函數(shù)和過程的包;另一方面,在性能上對(duì)原有GKD-Base PL/SQL引擎進(jìn)行優(yōu)化以提高編譯和執(zhí)行效率。
參考文獻(xiàn)
1 Ken Henderson. The Guru′s Guide to Transact-SQL. AddisonWesley PuB Co., 2000
2 PostgreSQL 7.4 Documentation.The PostgreSQL GloBal Development Group, 2003
3 Kenneth C.Louden著,馮博琴譯.編譯原理及實(shí)踐.北京:機(jī)械工業(yè)出版社,2000
4 Hector Garcia-Molina,Jeffrey D. Ullman,Jennifer Widom著.楊東青,唐世渭,徐其鈞譯. 數(shù)據(jù)庫系統(tǒng)實(shí)現(xiàn). 北京:機(jī)械工業(yè)出版社,2001
5 Levine,J.R.,lex與yacc(第二版).北京:機(jī)械工業(yè)出版社,2003

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請(qǐng)及時(shí)通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。