專利名稱:神通數(shù)據(jù)庫(kù)的包機(jī)制的實(shí)現(xiàn)方法
技術(shù)領(lǐng)域:
本發(fā)明屬于數(shù)據(jù)庫(kù)應(yīng)用技術(shù)領(lǐng)域,尤其是一種神通數(shù)據(jù)庫(kù)的包機(jī)制的實(shí)現(xiàn)方法。
背景技術(shù):
Oracle數(shù)據(jù)庫(kù)中的包是使用包名進(jìn)行分組的PL/SQL語(yǔ)句塊的集合,它含有存儲(chǔ) 過(guò)程、函數(shù)和全局變量等。使用包來(lái)綁定存儲(chǔ)過(guò)程和函數(shù)具有如下優(yōu)點(diǎn)(1)良好設(shè)計(jì)的包 是對(duì)象(如存儲(chǔ)過(guò)程、函數(shù)、全局變量等)的邏輯分組,當(dāng)?shù)谝淮握{(diào)用包時(shí),所有的代碼被加 載到內(nèi)存,即第一次調(diào)用包的成本雖然較高,但是之后的調(diào)用處理性能會(huì)比較高,因此,在 應(yīng)用程序中使用包,能夠比較經(jīng)濟(jì)地反復(fù)使用存儲(chǔ)過(guò)程和函數(shù);( 使用包可以收集類似 的存儲(chǔ)過(guò)程和函數(shù),并賦予公共的上下文,實(shí)現(xiàn)對(duì)它們的封裝;(3)在包中可以創(chuàng)建私有的 存儲(chǔ)過(guò)程和函數(shù),只能被相同包中的其他存儲(chǔ)過(guò)程和函數(shù)調(diào)用,這樣實(shí)現(xiàn)了信息隱藏。綜上 所述,Oracle包機(jī)制在數(shù)據(jù)庫(kù)后臺(tái)和網(wǎng)絡(luò)傳輸上不僅提高了執(zhí)行效率,而且信息隱藏的特 點(diǎn)提高了數(shù)據(jù)庫(kù)的安全性。但是,Oracle包機(jī)制的實(shí)現(xiàn)細(xì)節(jié)是不公開(kāi)的。目前,神通數(shù)據(jù)庫(kù)雖然也開(kāi)發(fā)了自身的過(guò)程式SQL語(yǔ)言,但是和Oracle這樣成熟 的數(shù)據(jù)庫(kù)相比,在功能完備性和執(zhí)行效率方面存在一定差距,尤其是不支持包功能,使得基 于Oracle開(kāi)發(fā)的應(yīng)用程序不能與神通數(shù)據(jù)庫(kù)進(jìn)行無(wú)縫對(duì)接,移植的工作量比較大;另外, 基于神通數(shù)據(jù)庫(kù)的復(fù)雜應(yīng)用邏輯,僅僅使用存儲(chǔ)過(guò)程和函數(shù)的效率沒(méi)有使用包機(jī)制的效率 尚ο
發(fā)明內(nèi)容
本發(fā)明的目的在于克服現(xiàn)有技術(shù)的不足,提供一種全面兼容Orac Ie PL/ SQLPackage的神通數(shù)據(jù)庫(kù)的包機(jī)制的實(shí)現(xiàn)方法,解決了神通數(shù)據(jù)庫(kù)與基于Oracle開(kāi)發(fā)的 應(yīng)用程序的無(wú)縫對(duì)接功能,提高了神通數(shù)據(jù)庫(kù)的執(zhí)行效率。本發(fā)明解決現(xiàn)有的技術(shù)問(wèn)題是采取以下技術(shù)方案實(shí)現(xiàn)的一種神通數(shù)據(jù)庫(kù)的包機(jī)制的實(shí)現(xiàn)方法,包括包的創(chuàng)建方法、包的執(zhí)行方法、包的編 譯方法和包的刪除方法,通過(guò)包的創(chuàng)建、包的執(zhí)行、包的編譯和包的刪除處理對(duì)包的系統(tǒng) 表、包管理器和包實(shí)例進(jìn)行管理,從而在神通數(shù)據(jù)庫(kù)上實(shí)現(xiàn)包機(jī)制的功能。而且,所述包的系統(tǒng)表包括關(guān)系系統(tǒng)表、源碼系統(tǒng)表、依賴關(guān)系系統(tǒng)表、包變量系 統(tǒng)表和包子程序系統(tǒng)表;該關(guān)系系統(tǒng)表存放包與表關(guān)系的唯一標(biāo)識(shí)號(hào)、名稱、關(guān)系類型和所 屬模式信息;該源碼系統(tǒng)表按行存放包頭和包體的源碼,該源碼系統(tǒng)表得字段含有包的唯 一標(biāo)識(shí)號(hào)、名稱、包頭和包體的區(qū)別標(biāo)識(shí)、源碼的行號(hào)和每行源碼;該依賴關(guān)系系統(tǒng)表存放 依賴與被依賴對(duì)象的唯一標(biāo)識(shí);該包變量系統(tǒng)表存放包的唯一標(biāo)識(shí)號(hào)、全局變量名稱、包頭 和包體的變量的區(qū)別標(biāo)識(shí);該包子程序系統(tǒng)表存放包的子程序的唯一標(biāo)識(shí)號(hào)、參數(shù)的數(shù)據(jù) 類型、參數(shù)的輸入和輸出類型、參數(shù)名稱、存儲(chǔ)過(guò)程和函數(shù)的區(qū)別標(biāo)識(shí)、子程序公有和私有 區(qū)別標(biāo)識(shí)、對(duì)應(yīng)包的唯一標(biāo)識(shí)號(hào)。而且,所述的包管理器由多個(gè)包項(xiàng)目組成,每個(gè)包項(xiàng)目包括包的唯一標(biāo)識(shí)號(hào)、包頭和包體是否失效、包被置為有效時(shí)的時(shí)間戳、包頭和包體的語(yǔ)法樹(shù)、以及包中存儲(chǔ)過(guò)程和函 數(shù)的語(yǔ)法樹(shù),在包管理器上擁有一個(gè)讀寫鎖。而且,所述的包實(shí)例是在用戶會(huì)話過(guò)程中建立的會(huì)話級(jí)的哈希表,該哈希表用于 存放被使用的包的信息,該包實(shí)例所對(duì)應(yīng)的包包括包的唯一標(biāo)識(shí)號(hào)、包頭聲明的公有全局 變量的拷貝、包體聲明的私有全局變量的拷貝、以及包被置為有效時(shí)的時(shí)間戳的拷貝。而且,所述的包的創(chuàng)建方法包括包頭的創(chuàng)建方法和包體的創(chuàng)建方法,其中,包頭的 創(chuàng)建方法包括如下步驟(1)語(yǔ)法解析模塊對(duì)包頭創(chuàng)建語(yǔ)句的解析;(2)包頭在關(guān)系系統(tǒng)表中的存儲(chǔ);(3)包頭源碼在源碼系統(tǒng)表中的存儲(chǔ);(4)過(guò)程語(yǔ)言模塊對(duì)包頭聲明部分的編譯;(5)包頭對(duì)象在包變量系統(tǒng)表、包子程序系統(tǒng)表中的存儲(chǔ);(6)包頭依賴關(guān)系在依賴關(guān)系系統(tǒng)表中的存儲(chǔ);(7)包管理器中新增包項(xiàng)目;所述的包體的創(chuàng)建方法包括如下步驟(1)語(yǔ)法解析模塊對(duì)包體創(chuàng)建語(yǔ)句的解析;(2)檢查包頭是否編譯;(3)包體在關(guān)系系統(tǒng)表和包體源碼在源碼系統(tǒng)表中的存儲(chǔ);(4)過(guò)程語(yǔ)言模塊對(duì)包體的解析;(5)包體對(duì)象在包變量系統(tǒng)表、包子程序系統(tǒng)表中的存儲(chǔ);(6)包體對(duì)包頭的依賴性檢查;(7)在包管理器中對(duì)應(yīng)包項(xiàng)目增加包體信息。而且,所述的包的執(zhí)行方法包括以下步驟(1)確定包和子程序的唯一標(biāo)識(shí)號(hào);(2)獲取包項(xiàng)目;(3)獲取包實(shí)例;(4)調(diào)用包中的子程序的語(yǔ)法樹(shù);(5)如果存在包的嵌套調(diào)用,則轉(zhuǎn)到第(2)步重復(fù)執(zhí)行;(6)事物結(jié)束。而且,所述的包的編譯方法是在包失效時(shí)對(duì)包進(jìn)行重新編譯的處理方法,包括以 下步驟(1)語(yǔ)法解析模塊對(duì)包編譯語(yǔ)句進(jìn)行解析,如果編譯語(yǔ)句為編譯包體,則執(zhí)行步驟 (3)的包體編譯步驟,否則執(zhí)行步驟O)的包頭的編譯步驟和步驟(3)的包體的編譯步驟;(2)包頭的編譯步驟首先對(duì)包管理器加寫鎖;然后在源碼系統(tǒng)表中獲取包頭源 碼,編譯包頭,重置包頭對(duì)象在包變量系統(tǒng)表、包子程序系統(tǒng)表中的存儲(chǔ),重置包頭在依賴 關(guān)系系統(tǒng)表中的存儲(chǔ);重置包管理器中的包項(xiàng)目;即將包體的有效標(biāo)識(shí)置為假,另外將依 賴于該包的其他包的有效標(biāo)識(shí)置為假;(3)包體的編譯步驟首先對(duì)包管理器加寫鎖;然后從源碼系統(tǒng)表中獲取包體源 碼對(duì)包體進(jìn)行編譯,重置包變量系統(tǒng)表、包子程序系統(tǒng)表、依賴關(guān)系系統(tǒng)表中的存儲(chǔ);最后更新包項(xiàng)目中的包體編譯信息,即將包體編譯有效位置為真并更新時(shí)間戳,釋放包管理器 的寫鎖。而且,所述的包失效的判斷方法為(1)包頭和包體在被創(chuàng)建后并且未被引用之前,處于失效狀態(tài);(2)包依賴的關(guān)系被刪除或結(jié)構(gòu)發(fā)生變化,對(duì)應(yīng)的包頭或包體失效;(3)包頭失效時(shí),包體失效;調(diào)用它的子程序失效;(4)包頭被重新創(chuàng)建,包頭失效;(5)包體被重新創(chuàng)建,包體失效;(6)包頭被重新編譯,包體失效;(7)包頭被刪除,包頭和包體失效;(8)包體被刪除,包體失效;(9)子程序被創(chuàng)建,引用失效包,包頭變?yōu)橛行?,包體還是無(wú)效。而且,所述的包的刪除方法包括以下步驟(1)語(yǔ)法解析模塊對(duì)包刪除語(yǔ)句進(jìn)行解析,如果包刪除語(yǔ)句為刪除包體,則執(zhí)行步 驟(3)的包體的刪除步驟;否則執(zhí)行步驟O)的包頭刪除和步驟(3)的包體的刪除步驟;(2)包頭的刪除步驟首先對(duì)包管理器加寫鎖,刪除包對(duì)應(yīng)的包項(xiàng)目,并將引用此 包的其他包的包頭有效位置為假,釋放包管理器的寫鎖;然后清除包頭和包體在包變量系 統(tǒng)表、源碼系統(tǒng)表、關(guān)系系統(tǒng)表和依賴關(guān)系系統(tǒng)表中的記錄;(3)包體的刪除步驟對(duì)包管理器加寫鎖,將包項(xiàng)目中的包體的有效標(biāo)識(shí)置為假, 釋放包管理器的寫鎖;然后清除包體在包變量系統(tǒng)表、源碼系統(tǒng)表、關(guān)系系統(tǒng)表和依賴關(guān)系 系統(tǒng)表中的記錄。本發(fā)明的優(yōu)點(diǎn)和積極效果是1、本發(fā)明通過(guò)包的創(chuàng)建、包的執(zhí)行、包的編譯和包的刪除處理對(duì)包的系統(tǒng)表、包管 理器和包實(shí)例進(jìn)行管理,從而在神通數(shù)據(jù)庫(kù)上實(shí)現(xiàn)包機(jī)制的功能,將復(fù)雜的應(yīng)用邏輯中相 關(guān)的方法或操作轉(zhuǎn)換為存儲(chǔ)過(guò)程或函數(shù),將存儲(chǔ)過(guò)程和函數(shù)共同操作的數(shù)據(jù)轉(zhuǎn)化為全局變 量,然后將這些存儲(chǔ)過(guò)程、函數(shù)和全局變量組合成神通數(shù)據(jù)庫(kù)的包,通過(guò)將復(fù)雜的應(yīng)用邏輯 轉(zhuǎn)化為神通數(shù)據(jù)庫(kù)服務(wù)器上的包,可以大大減少網(wǎng)絡(luò)上數(shù)據(jù)的傳輸,降低應(yīng)用開(kāi)發(fā)的工作 量。2、本發(fā)明通過(guò)包機(jī)制使得用戶能夠訪問(wèn)包中的存儲(chǔ)過(guò)程、函數(shù)和全局變量,并可 查看包頭中存儲(chǔ)過(guò)程、函數(shù)和全局變量的聲明,但是隱藏了包體中它們的定義,提高了神通 數(shù)據(jù)庫(kù)的安全性。3、本發(fā)明通過(guò)包機(jī)制使得每個(gè)用戶共享包中存儲(chǔ)過(guò)程和函數(shù)的語(yǔ)法樹(shù),同時(shí)另有 屬于自己的全局變量的拷貝,從而即保證了包的操作的高效率,又保證了每個(gè)用戶數(shù)據(jù)的 獨(dú)立性。
圖1是包頭的創(chuàng)建方法流程圖;圖2是包體的創(chuàng)建方法流程圖;圖3是包的執(zhí)行方法流程圖4是包的編譯方法流程圖;圖5是包的刪除方法流程圖。
具體實(shí)施例方式以下結(jié)合附圖對(duì)本發(fā)明實(shí)施例做進(jìn)一步詳述。一種神通數(shù)據(jù)庫(kù)的包機(jī)制的實(shí)現(xiàn)方法,包括包的創(chuàng)建方法、包的執(zhí)行方法、包的編 譯方法和包的刪除方法,通過(guò)包的創(chuàng)建、包的執(zhí)行、包的編譯和包的刪除處理對(duì)包的系統(tǒng) 表、包管理器和包實(shí)例進(jìn)行管理,從而在神通數(shù)據(jù)庫(kù)上實(shí)現(xiàn)包機(jī)制的功能。包的系統(tǒng)表用來(lái)存放與包有關(guān)的信息,包括關(guān)系系統(tǒng)表、源碼系統(tǒng)表、依賴關(guān)系 系統(tǒng)表、包變量系統(tǒng)表和包子程序系統(tǒng)表。其中關(guān)系系統(tǒng)表存放包、表等關(guān)系的唯一標(biāo)識(shí) 號(hào)、名稱、關(guān)系類型、所屬模式等信息;源碼系統(tǒng)表按行存放包頭和包體的源碼,其字段有包 的唯一標(biāo)識(shí)號(hào)、名稱、包頭和包體的區(qū)別標(biāo)識(shí)、源碼的行號(hào)和每行源碼;依賴關(guān)系系統(tǒng)表存 放依賴與被依賴對(duì)象的唯一標(biāo)識(shí);包變量系統(tǒng)表存放包的唯一標(biāo)識(shí)號(hào)、全局變量名稱、包頭 和包體的變量的區(qū)別標(biāo)識(shí);包子程序系統(tǒng)表存放包的子程序的唯一標(biāo)識(shí)號(hào)、參數(shù)的數(shù)據(jù)類 型、參數(shù)的輸入和輸出類型、參數(shù)名稱、存儲(chǔ)過(guò)程和函數(shù)的區(qū)別標(biāo)識(shí)、子程序公有和私有區(qū) 別標(biāo)識(shí)、對(duì)應(yīng)包的唯一標(biāo)識(shí)號(hào)等。包管理器在神通數(shù)據(jù)庫(kù)中具有全局屬性,由多個(gè)包項(xiàng)目組成,每個(gè)包項(xiàng)目對(duì)應(yīng)一 個(gè)包;它記錄了包的唯一標(biāo)識(shí)號(hào)、包頭和包體是否失效、包被置為有效時(shí)的時(shí)間戳、包頭和 包體的語(yǔ)法樹(shù)、以及包中存儲(chǔ)過(guò)程和函數(shù)的語(yǔ)法樹(shù)。包管理器上還擁有一個(gè)讀寫鎖,當(dāng)遍歷 包管理器時(shí),加讀鎖;當(dāng)創(chuàng)建或刪除包時(shí),加寫鎖。包實(shí)例是在神通數(shù)據(jù)庫(kù)的用戶會(huì)話過(guò)程中建立的會(huì)話級(jí)的哈希表,該哈希表用于 存放被使用的包的信息。每個(gè)包實(shí)例對(duì)應(yīng)一個(gè)包,它記錄了包的唯一標(biāo)識(shí)號(hào)、包頭聲明的公 有全局變量的拷貝、包體聲明的私有全局變量的拷貝、以及包被置為有效時(shí)的時(shí)間戳的拷 貝。下面分別對(duì)神通數(shù)據(jù)庫(kù)的包的創(chuàng)建方法、包的執(zhí)行方法、包的編譯方法和包的刪 除方法分別進(jìn)行說(shuō)明。1、包的創(chuàng)建方法包括包頭的創(chuàng)建方法和包體的創(chuàng)建方法。如圖1所示,包頭的創(chuàng)建過(guò)程包括以下步驟(1)語(yǔ)法解析模塊對(duì)包頭創(chuàng)建語(yǔ)句的解析在本步驟中,語(yǔ)法解析模塊負(fù)責(zé)對(duì)包頭除聲明語(yǔ)句外的定義部分的解析,確認(rèn)包 的創(chuàng)建語(yǔ)法正確性,并獲取包的名稱和所屬模式。(2)包頭在關(guān)系系統(tǒng)表中的存儲(chǔ)在本步驟中,語(yǔ)言定義模塊為包分配唯一標(biāo)識(shí)號(hào),并將唯一標(biāo)識(shí)號(hào)、包名、所屬模 式等存放于關(guān)系系統(tǒng)表中。(3)包頭源碼在源碼系統(tǒng)表中的存儲(chǔ)在本步驟中,語(yǔ)言定義模塊負(fù)責(zé)包在關(guān)系系統(tǒng)表中的存儲(chǔ)和包頭源碼在源碼系統(tǒng) 表中的存儲(chǔ)。(4)過(guò)程語(yǔ)言模塊對(duì)包頭聲明部分的編譯在本步驟中,過(guò)程源碼模塊從源碼系統(tǒng)表中獲取全局變量、存儲(chǔ)過(guò)程和函數(shù)的聲明進(jìn)行編譯。(5)包頭對(duì)象在包變量系統(tǒng)表、包子程序系統(tǒng)表中的存儲(chǔ)在本步驟中,過(guò)程語(yǔ)言模塊將上一步編譯出的全局變量的信息存入包變量系統(tǒng) 表,將存儲(chǔ)過(guò)程和函數(shù)的信息存入包子程序系統(tǒng)表。(6)包頭依賴關(guān)系在依賴關(guān)系系統(tǒng)表中的存儲(chǔ)在本步驟中,過(guò)程語(yǔ)言模塊將包的唯一標(biāo)識(shí)號(hào)和被引用的其他包和表的唯一標(biāo)識(shí) 號(hào)存放與依賴關(guān)系系統(tǒng)表中。(7)包管理器中新增包項(xiàng)目在本步驟中,首先對(duì)包管理器加寫鎖;然后構(gòu)造一個(gè)新的包項(xiàng)目,存入包的唯一標(biāo) 識(shí)號(hào)、包頭的語(yǔ)法樹(shù),將包頭的有效標(biāo)識(shí)置為真;最后釋放包管理器的寫鎖。如圖2所示,包體的創(chuàng)建方法,包括以下步驟(1)語(yǔ)法解析模塊對(duì)包體創(chuàng)建語(yǔ)句的解析在本步驟中,同包頭的創(chuàng)建一樣,語(yǔ)法解析模塊負(fù)責(zé)對(duì)創(chuàng)建包體的語(yǔ)句進(jìn)行解析, 確認(rèn)包的創(chuàng)建語(yǔ)法正確性,并獲取包的名稱和所屬模式。(2)檢查包頭是否編譯在本步驟中,語(yǔ)法解析模塊檢查包頭后,如果包頭沒(méi)有編譯,則對(duì)包頭進(jìn)行編譯, 即從源碼系統(tǒng)表中獲取包頭的源碼,過(guò)程語(yǔ)言模塊對(duì)包頭的聲明部分進(jìn)行編譯,然后將包 頭對(duì)象存放于包變量系統(tǒng)表和包子程序系統(tǒng)表中,將包對(duì)其他包和表的依賴關(guān)系存放于依 賴關(guān)系系統(tǒng)表中,并在包管理器中新增包項(xiàng)目。(3)包體在關(guān)系系統(tǒng)表和包體源碼在源碼系統(tǒng)表中的存儲(chǔ)在本步驟中,語(yǔ)言定義模塊為包體在關(guān)系系統(tǒng)表中分配唯一標(biāo)志號(hào),并將包體的 源代碼寫入源碼系統(tǒng)表中。(4)過(guò)程語(yǔ)言模塊對(duì)包體的解析在本步驟中,過(guò)程語(yǔ)言模塊將包體中的聲明語(yǔ)句、子程序的定義語(yǔ)句和初始化語(yǔ) 句分別進(jìn)行解析。在包體的存儲(chǔ)過(guò)程或函數(shù)的定義中,嵌套引用了存儲(chǔ)過(guò)程或函數(shù),如果引 用的是本包的、隱含的包名在解析時(shí)必須補(bǔ)上。包的存儲(chǔ)過(guò)程或函數(shù)被引用前,必須先聲明 它。(5)包體對(duì)象在包變量系統(tǒng)表、包子程序系統(tǒng)表中的存儲(chǔ)包體對(duì)象是包的私有對(duì)象,在本步驟中,過(guò)程語(yǔ)言模塊將包體對(duì)象存儲(chǔ)在包變量 系統(tǒng)表和包子程序系統(tǒng)表中。(6)包體對(duì)包頭的依賴性檢查在本步驟中,過(guò)程語(yǔ)言模塊進(jìn)行包體對(duì)包頭的依賴性檢查,由于包體的解析不僅 要檢查語(yǔ)句塊是否符合語(yǔ)法規(guī)則,還要檢查包體中的過(guò)程或函數(shù)的說(shuō)明和包頭中對(duì)應(yīng)的過(guò) 程或函數(shù)是否完全相同。該依賴性檢查具體方法為包頭中聲明的函數(shù)或存儲(chǔ)過(guò)程在包體 中有同名的對(duì)象;函數(shù)或存儲(chǔ)過(guò)程的參數(shù)個(gè)數(shù)相同;函數(shù)或存儲(chǔ)過(guò)程的參數(shù)的數(shù)據(jù)類型相 同;函數(shù)或存儲(chǔ)過(guò)程的參數(shù)的輸入輸出類型相同;在包頭和包體的聲明語(yǔ)句部分,不能聲 明相同名字的變量。(7)在包管理器中對(duì)應(yīng)包項(xiàng)目增加包體信息在本步驟中,首先對(duì)包管理器加寫鎖;然后找到包管理器中對(duì)應(yīng)該包的包項(xiàng)目,將包體的語(yǔ)法樹(shù)加入,并把包體有效標(biāo)識(shí)置為真,另外記錄有效時(shí)的時(shí)間戳;最后釋放包管理 器的寫鎖。2、包的執(zhí)行方法。神通數(shù)據(jù)庫(kù)對(duì)包的執(zhí)行采用編譯預(yù)處理技術(shù),即在詞法掃描中發(fā)現(xiàn)對(duì)包中對(duì)象的 調(diào)用語(yǔ)句后,立即找到包的源代碼進(jìn)行解析,然后將解析結(jié)果的指針?lè)诺桨芾砥髦?。在?zhí) 行包的對(duì)象調(diào)用語(yǔ)句時(shí),根據(jù)存儲(chǔ)過(guò)程或函數(shù)的標(biāo)志號(hào)直接定位到它的語(yǔ)法樹(shù)然后解釋執(zhí) 行該語(yǔ)法樹(shù)。如果找不到對(duì)應(yīng)的語(yǔ)法樹(shù),判斷包是否失效,如果是則重新編譯;如果不是則 提取源碼進(jìn)行重編譯。由于包的預(yù)編譯只需要編譯一次包的源代碼,在包中對(duì)象被多次引 用的情況下,可以避免每次執(zhí)行該對(duì)象時(shí)的重復(fù)編譯,從而提高了包的執(zhí)行效率。如圖3所示,包的執(zhí)行方法包括以下步驟(1)確定包和子程序的唯一標(biāo)識(shí)號(hào)在本步驟中,通過(guò)對(duì)“模式名.包名.包中對(duì)象名”的解析,確定包中存儲(chǔ)過(guò)程或 函數(shù)的唯一標(biāo)識(shí)號(hào)。(2)獲取包項(xiàng)目在本步驟中,對(duì)包管理器加讀鎖;定位到當(dāng)前包的包項(xiàng)目,如果有包頭或包體失 效,則對(duì)它進(jìn)行重新編譯。(3)獲取包實(shí)例在本步驟中,如果是本會(huì)話中首次執(zhí)行該包中的對(duì)象,則對(duì)包進(jìn)行初始化操作。首 先,從包項(xiàng)目拷貝該包的全局變量和有效時(shí)的時(shí)間戳,然后執(zhí)行初始化代碼,最后將這個(gè)包 實(shí)例插入本會(huì)話中的哈希表中;如果不是首次執(zhí)行該包中的對(duì)象,則定位到本會(huì)話中的當(dāng) 前包的包實(shí)例,判斷它和對(duì)應(yīng)的包項(xiàng)目的時(shí)間戳是否相等。如果不相等,則對(duì)包進(jìn)行再次初 始化操作。(4)調(diào)用包中的子程序的語(yǔ)法樹(shù)在本步驟中,通過(guò)存儲(chǔ)過(guò)程或函數(shù)的唯一標(biāo)識(shí)號(hào),由此調(diào)用對(duì)應(yīng)的語(yǔ)法樹(shù)。如果涉 及全局變量的讀寫,則對(duì)本會(huì)話中的包實(shí)例的全局變量的拷貝進(jìn)行操作。(5)如果存在包的嵌套調(diào)用,則轉(zhuǎn)到第(2)步重復(fù)執(zhí)行(6)事物結(jié)束在本步驟中,事物結(jié)束時(shí)將自動(dòng)釋放包管理器的讀鎖。3、包的編譯方法在神通數(shù)據(jù)庫(kù)中,當(dāng)包失效時(shí),需要對(duì)包進(jìn)行重新編譯。在如下情況下,包處于失 效狀態(tài)(1)包頭和包體在被創(chuàng)建后并且未被引用之前,處于失效狀態(tài);(2)包依賴的關(guān)系被刪除或結(jié)構(gòu)發(fā)生變化,對(duì)應(yīng)的包頭或包體失效;(3)包頭失效時(shí),包體失效;調(diào)用它的子程序失效;(4)包頭被重新創(chuàng)建,包頭失效;(5)包體被重新創(chuàng)建,包體失效;(6)包頭被重新編譯,包體失效;(7)包頭被刪除,包頭和包體失效;(8)包體被刪除,包體失效;
(9)子程序被創(chuàng)建,引用失效包,包頭變?yōu)橛行?,包體還是無(wú)效。當(dāng)包失效時(shí),在包管理器中設(shè)置失效標(biāo)識(shí),并刪除包變量系統(tǒng)表、包子程序系統(tǒng)表 中的該包的對(duì)象對(duì)應(yīng)的信息。包每次被執(zhí)行時(shí),都需要判斷包頭和包體是否失效,如果包失 效,則需要進(jìn)行包的編譯處理。如圖4所示,包的編譯方法包括以下步驟(1)語(yǔ)法解析模塊對(duì)包編譯語(yǔ)句進(jìn)行解析,如果編譯語(yǔ)句為編譯包體,則執(zhí)行步驟 (3)的包體編譯步驟,否則執(zhí)行步驟O)的包頭的編譯步驟和步驟(3)的包體的編譯步驟;(2)包頭的編譯步驟首先對(duì)包管理器加寫鎖;然后在源碼系統(tǒng)表中獲取包頭源 碼,編譯包頭,重置包頭對(duì)象在包變量系統(tǒng)表、包子程序系統(tǒng)表中的存儲(chǔ),重置包頭在依賴 關(guān)系系統(tǒng)表中的存儲(chǔ);重置包管理器中的包項(xiàng)目;即將包體的有效標(biāo)識(shí)置為假,另外將依 賴于該包的其他包的有效標(biāo)識(shí)置為假;(3)包體的編譯步驟首先對(duì)包管理器加寫鎖;然后從源碼系統(tǒng)表中獲取包體源 碼對(duì)包體進(jìn)行編譯,重置包變量系統(tǒng)表、包子程序系統(tǒng)表、依賴關(guān)系系統(tǒng)表中的存儲(chǔ);最后 更新包項(xiàng)目中的包體編譯信息,即將包體編譯有效位置為真并更新時(shí)間戳,釋放包管理器 的寫鎖。4、包的刪除方法如圖5所示,包的刪除方法包括以下步驟(1)語(yǔ)法解析模塊對(duì)包刪除語(yǔ)句進(jìn)行解析,如果包刪除語(yǔ)句為刪除包體,則執(zhí)行步 驟(3)的包體的刪除步驟;否則執(zhí)行步驟O)的包頭刪除和步驟(3)的包體的刪除步驟;(2)包頭的刪除步驟首先對(duì)包管理器加寫鎖,刪除包對(duì)應(yīng)的包項(xiàng)目,并將引用此 包的其他包的包頭有效位置為假,釋放包管理器的寫鎖;然后清除包頭和包體在包變量系 統(tǒng)表、源碼系統(tǒng)表、關(guān)系系統(tǒng)表和依賴關(guān)系系統(tǒng)表中的記錄;(3)包體的刪除步驟對(duì)包管理器加寫鎖,將包項(xiàng)目中的包體的有效標(biāo)識(shí)置為假, 釋放包管理器的寫鎖;然后清除包體在包變量系統(tǒng)表、源碼系統(tǒng)表、關(guān)系系統(tǒng)表和依賴關(guān)系 系統(tǒng)表中的記錄。本發(fā)明所述的實(shí)施例是說(shuō)明性的,而不是限定性的,因此發(fā)明并不限于具體實(shí)施 方式中所述的實(shí)施例,凡是由本領(lǐng)域技術(shù)人員根據(jù)本發(fā)明的技術(shù)方案得出的其他實(shí)施方 式,同樣屬于本發(fā)明保護(hù)的范圍。
權(quán)利要求
1.一種神通數(shù)據(jù)庫(kù)的包機(jī)制的實(shí)現(xiàn)方法,其特征在于包括包的創(chuàng)建方法、包的執(zhí)行 方法、包的編譯方法和包的刪除方法,通過(guò)包的創(chuàng)建、包的執(zhí)行、包的編譯和包的刪除處理 對(duì)包的系統(tǒng)表、包管理器和包實(shí)例進(jìn)行管理,從而在神通數(shù)據(jù)庫(kù)上實(shí)現(xiàn)包機(jī)制的功能。
2.根據(jù)權(quán)利要求1所述的神通數(shù)據(jù)庫(kù)的包機(jī)制的實(shí)現(xiàn)方法,其特征在于所述包的系 統(tǒng)表包括關(guān)系系統(tǒng)表、源碼系統(tǒng)表、依賴關(guān)系系統(tǒng)表、包變量系統(tǒng)表和包子程序系統(tǒng)表;該 關(guān)系系統(tǒng)表存放包與表關(guān)系的唯一標(biāo)識(shí)號(hào)、名稱、關(guān)系類型和所屬模式信息;該源碼系統(tǒng)表 按行存放包頭和包體的源碼,該源碼系統(tǒng)表得字段含有包的唯一標(biāo)識(shí)號(hào)、名稱、包頭和包體 的區(qū)別標(biāo)識(shí)、源碼的行號(hào)和每行源碼;該依賴關(guān)系系統(tǒng)表存放依賴與被依賴對(duì)象的唯一標(biāo) 識(shí);該包變量系統(tǒng)表存放包的唯一標(biāo)識(shí)號(hào)、全局變量名稱、包頭和包體的變量的區(qū)別標(biāo)識(shí); 該包子程序系統(tǒng)表存放包的子程序的唯一標(biāo)識(shí)號(hào)、參數(shù)的數(shù)據(jù)類型、參數(shù)的輸入和輸出類 型、參數(shù)名稱、存儲(chǔ)過(guò)程和函數(shù)的區(qū)別標(biāo)識(shí)、子程序公有和私有區(qū)別標(biāo)識(shí)、對(duì)應(yīng)包的唯一標(biāo) 識(shí)號(hào)。
3.根據(jù)權(quán)利要求1所述的神通數(shù)據(jù)庫(kù)的包機(jī)制的實(shí)現(xiàn)方法,其特征在于所述的包管 理器由多個(gè)包項(xiàng)目組成,每個(gè)包項(xiàng)目包括包的唯一標(biāo)識(shí)號(hào)、包頭和包體是否失效、包被置為 有效時(shí)的時(shí)間戳、包頭和包體的語(yǔ)法樹(shù)、以及包中存儲(chǔ)過(guò)程和函數(shù)的語(yǔ)法樹(shù),在包管理器上 擁有一個(gè)讀寫鎖。
4.根據(jù)權(quán)利要求1所述的神通數(shù)據(jù)庫(kù)的包機(jī)制的實(shí)現(xiàn)方法,其特征在于所述的包實(shí) 例是在用戶會(huì)話過(guò)程中建立的會(huì)話級(jí)的哈希表,該哈希表用于存放被使用的包的信息,該 包實(shí)例所對(duì)應(yīng)的包包括包的唯一標(biāo)識(shí)號(hào)、包頭聲明的公有全局變量的拷貝、包體聲明的私 有全局變量的拷貝、以及包被置為有效時(shí)的時(shí)間戳的拷貝。
5.根據(jù)權(quán)利要求1至4任一項(xiàng)所述的神通數(shù)據(jù)庫(kù)的包機(jī)制的實(shí)現(xiàn)方法,其特征在于 所述的包的創(chuàng)建方法包括包頭的創(chuàng)建方法和包體的創(chuàng)建方法,其中,包頭的創(chuàng)建方法包括 如下步驟(1)語(yǔ)法解析模塊對(duì)包頭創(chuàng)建語(yǔ)句的解析;(2)包頭在關(guān)系系統(tǒng)表中的存儲(chǔ);(3)包頭源碼在源碼系統(tǒng)表中的存儲(chǔ);(4)過(guò)程語(yǔ)言模塊對(duì)包頭聲明部分的編譯;(5)包頭對(duì)象在包變量系統(tǒng)表、包子程序系統(tǒng)表中的存儲(chǔ);(6)包頭依賴關(guān)系在依賴關(guān)系系統(tǒng)表中的存儲(chǔ);(7)包管理器中新增包項(xiàng)目;所述的包體的創(chuàng)建方法包括如下步驟(1)語(yǔ)法解析模塊對(duì)包體創(chuàng)建語(yǔ)句的解析;(2)檢查包頭是否編譯;(3)包體在關(guān)系系統(tǒng)表和包體源碼在源碼系統(tǒng)表中的存儲(chǔ);(4)過(guò)程語(yǔ)言模塊對(duì)包體的解析;(5)包體對(duì)象在包變量系統(tǒng)表、包子程序系統(tǒng)表中的存儲(chǔ);(6)包體對(duì)包頭的依賴性檢查;(7)在包管理器中對(duì)應(yīng)包項(xiàng)目增加包體信息。
6.根據(jù)權(quán)利要求1至4任一項(xiàng)所述的神通數(shù)據(jù)庫(kù)的包機(jī)制的實(shí)現(xiàn)方法,其特征在于所述的包的執(zhí)行方法包括以下步驟(1)確定包和子程序的唯一標(biāo)識(shí)號(hào);(2)獲取包項(xiàng)目;(3)獲取包實(shí)例;(4)調(diào)用包中的子程序的語(yǔ)法樹(shù);(5)如果存在包的嵌套調(diào)用,則轉(zhuǎn)到第(2)步重復(fù)執(zhí)行;(6)事物結(jié)束。
7.根據(jù)權(quán)利要求1至4任一項(xiàng)所述的神通數(shù)據(jù)庫(kù)的包機(jī)制的實(shí)現(xiàn)方法,其特征在于 所述的包的編譯方法是在包失效時(shí)對(duì)包進(jìn)行重新編譯的處理方法,包括以下步驟(1)語(yǔ)法解析模塊對(duì)包編譯語(yǔ)句進(jìn)行解析,如果編譯語(yǔ)句為編譯包體,則執(zhí)行步驟(3) 的包體編譯步驟,否則執(zhí)行步驟O)的包頭的編譯步驟和步驟(3)的包體的編譯步驟;(2)包頭的編譯步驟首先對(duì)包管理器加寫鎖;然后在源碼系統(tǒng)表中獲取包頭源碼,編 譯包頭,重置包頭對(duì)象在包變量系統(tǒng)表、包子程序系統(tǒng)表中的存儲(chǔ),重置包頭在依賴關(guān)系系 統(tǒng)表中的存儲(chǔ);重置包管理器中的包項(xiàng)目;即將包體的有效標(biāo)識(shí)置為假,另外將依賴于該 包的其他包的有效標(biāo)識(shí)置為假;(3)包體的編譯步驟首先對(duì)包管理器加寫鎖;然后從源碼系統(tǒng)表中獲取包體源碼對(duì) 包體進(jìn)行編譯,重置包變量系統(tǒng)表、包子程序系統(tǒng)表、依賴關(guān)系系統(tǒng)表中的存儲(chǔ);最后更新 包項(xiàng)目中的包體編譯信息,即將包體編譯有效位置為真并更新時(shí)間戳,釋放包管理器的寫 鎖。
8.根據(jù)權(quán)利要求7所述的神通數(shù)據(jù)庫(kù)的包機(jī)制的實(shí)現(xiàn)方法,其特征在于所述的包失 效的判斷方法為(1)包頭和包體在被創(chuàng)建后并且未被引用之前,處于失效狀態(tài);(2)包依賴的關(guān)系被刪除或結(jié)構(gòu)發(fā)生變化,對(duì)應(yīng)的包頭或包體失效;(3)包頭失效時(shí),包體失效;調(diào)用它的子程序失效;(4)包頭被重新創(chuàng)建,包頭失效;(5)包體被重新創(chuàng)建,包體失效;(6)包頭被重新編譯,包體失效;(7)包頭被刪除,包頭和包體失效;(8)包體被刪除,包體失效;(9)子程序被創(chuàng)建,引用失效包,包頭變?yōu)橛行Вw還是無(wú)效。
9.根據(jù)權(quán)利要求1至4任一項(xiàng)所述的神通數(shù)據(jù)庫(kù)的包機(jī)制的實(shí)現(xiàn)方法,其特征在于 所述的包的刪除方法包括以下步驟(1)語(yǔ)法解析模塊對(duì)包刪除語(yǔ)句進(jìn)行解析,如果包刪除語(yǔ)句為刪除包體,則執(zhí)行步驟 (3)的包體的刪除步驟;否則執(zhí)行步驟O)的包頭刪除和步驟(3)的包體的刪除步驟;(2)包頭的刪除步驟首先對(duì)包管理器加寫鎖,刪除包對(duì)應(yīng)的包項(xiàng)目,并將引用此包的 其他包的包頭有效位置為假,釋放包管理器的寫鎖;然后清除包頭和包體在包變量系統(tǒng)表、 源碼系統(tǒng)表、關(guān)系系統(tǒng)表和依賴關(guān)系系統(tǒng)表中的記錄;(3)包體的刪除步驟對(duì)包管理器加寫鎖,將包項(xiàng)目中的包體的有效標(biāo)識(shí)置為假,釋放 包管理器的寫鎖;然后清除包體在包變量系統(tǒng)表、源碼系統(tǒng)表、關(guān)系系統(tǒng)表和依賴關(guān)系系統(tǒng)表中的記錄。
全文摘要
本發(fā)明涉及一種神通數(shù)據(jù)庫(kù)的包機(jī)制的實(shí)現(xiàn)方法,包括包的創(chuàng)建方法、包的執(zhí)行方法、包的編譯方法和包的刪除方法,通過(guò)包的創(chuàng)建、包的執(zhí)行、包的編譯和包的刪除處理對(duì)包的系統(tǒng)表、包管理器和包實(shí)例進(jìn)行管理,從而在神通數(shù)據(jù)庫(kù)上實(shí)現(xiàn)包機(jī)制的功能。本發(fā)明實(shí)現(xiàn)了神通數(shù)據(jù)庫(kù)與基于Oracle開(kāi)發(fā)的應(yīng)用程序的無(wú)縫對(duì)接功能,通過(guò)將復(fù)雜的應(yīng)用邏輯轉(zhuǎn)化為神通數(shù)據(jù)庫(kù)服務(wù)器上的包,可以大大減少網(wǎng)絡(luò)上數(shù)據(jù)的傳輸,降低應(yīng)用開(kāi)發(fā)的工作量,提高了神通數(shù)據(jù)庫(kù)的執(zhí)行效率。
文檔編號(hào)G06F17/30GK102054050SQ20111003336
公開(kāi)日2011年5月11日 申請(qǐng)日期2011年1月30日 優(yōu)先權(quán)日2011年1月30日
發(fā)明者何清法, 馮柯, 周麗霞, 孫鵬, 尚博, 彭賀, 胡秀龍, 蔣志勇, 謝衛(wèi)平, 顧云蘇 申請(qǐng)人:天津神舟通用數(shù)據(jù)技術(shù)有限公司