openGauss存儲(chǔ)過程功能全面升級(jí),支持PACKAGE,PLDEBUGGER等諸多新特性
存儲(chǔ)過程類似于面向過程語言當(dāng)中的函數(shù),可以實(shí)現(xiàn)面向過程語言當(dāng)中的聲明變量、邏輯判斷、條件循環(huán)等操作,是一組完成特定功能的SQL語句集合。
在openGauss 2.1 之前的版本中,存儲(chǔ)過程支持了定義變量、條件循環(huán)、邏輯判斷等基本功能,但是沒有面向?qū)ο笳Z言中類的形式,因此無法對(duì)存儲(chǔ)過程中的變量以及函數(shù)進(jìn)行封裝,也無法在存儲(chǔ)過程內(nèi)使用全局變量。在以前的版本中沒有支持類似gdb的功能,用戶調(diào)試存儲(chǔ)過程只能夠使用raise info等打印變量的方式。并且在之前的版本當(dāng)中,存儲(chǔ)過程發(fā)生異常后,沒有自治事務(wù),記錄錯(cuò)誤日志不便。
而在新的版本當(dāng)中,通過支持PACKAGE、存儲(chǔ)過程調(diào)試/PLDEBUGGER、自治事務(wù)等新功能,解決了上述問題。下面將介紹新特性的應(yīng)用場(chǎng)景以及使用方法。
特性一、PACKAGE
package是一組相關(guān)存儲(chǔ)過程、函數(shù)、變量、常量、游標(biāo)等PL/SQL程序的組合,具有面向?qū)ο蟮奶攸c(diǎn),可以對(duì)PL/SQL程序設(shè)計(jì)元素進(jìn)行封裝。package中的函數(shù)具有統(tǒng)一性,創(chuàng)建、刪除、修改都統(tǒng)一進(jìn)行。
package包含包頭(Package Specification)和Package Body兩個(gè)部分,其中包頭所包含的聲明可以被外部函數(shù)、匿名塊等訪問,而在包體中包含的聲明不能被外部函數(shù)、匿名塊等訪問,只能被包體內(nèi)函數(shù)和存儲(chǔ)過程等訪問。
下面可以看一組簡(jiǎn)單的例子理解一下:
特性二、PLDEBUGGER
DBE_PLDEBUGGER用于調(diào)試存儲(chǔ)過程,類似于GDB的功能,可以使用單步調(diào)試,設(shè)置斷點(diǎn)、打印調(diào)用堆棧等功能,方便了存儲(chǔ)過程的調(diào)試,減小了存儲(chǔ)過程的開發(fā)難度。詳細(xì)的使用方法以及說明可以參考在本文末提供的?[PLDEBUGGER接口及示例]
特性三、自治事務(wù)
自治事務(wù)(Autonomous Transaction),在主事務(wù)執(zhí)行過程中新啟的獨(dú)立的事務(wù)。自治事務(wù)的提交和回滾不會(huì)影響主事務(wù)已提交的數(shù)據(jù),同時(shí)自治事務(wù)也不受主事務(wù)影響。
自治事務(wù)在存儲(chǔ)過程、函數(shù)和匿名塊中定義,用PRAGMA AUTONOMOUS_TRANSACTION關(guān)鍵字來聲明。
自治事務(wù)一般用于存儲(chǔ)過程發(fā)生異常后,處理日志的時(shí)候。
下面可以看一個(gè)簡(jiǎn)單的示例:
pldebugger 接口及示例

示例
準(zhǔn)備調(diào)試
通過PG_PROC,查找到待調(diào)試存儲(chǔ)過程的oid,并執(zhí)行DBE_PLDEBUGGER.turn_on(oid)。本客戶端就會(huì)作為server端使用
開始調(diào)試
server端執(zhí)行存儲(chǔ)過程,會(huì)在存儲(chǔ)過程內(nèi)第一條SQL語句前hang住,等待debug端發(fā)送的調(diào)試消息。僅支持直接執(zhí)行存儲(chǔ)過程的調(diào)試,不支持通過trigger調(diào)用執(zhí)行的存儲(chǔ)過程調(diào)試。
再起一個(gè)客戶端,作為debug端,通過turn_on返回的數(shù)據(jù),調(diào)用DBE_PLDEBUGGER.attach關(guān)聯(lián)到該存儲(chǔ)過程上進(jìn)行調(diào)試。
在執(zhí)行attach的客戶端調(diào)試,執(zhí)行下一條statement。
在執(zhí)行attach的客戶端調(diào)試,可以執(zhí)行以下變量操作
直接執(zhí)行完成當(dāng)前正在調(diào)試的存儲(chǔ)過程。
直接退出當(dāng)前正在調(diào)試的存儲(chǔ)過程,不執(zhí)行尚未執(zhí)行的語句。
client端查看代碼信息并識(shí)別可以設(shè)置斷點(diǎn)行號(hào)。
設(shè)置斷點(diǎn)
查看斷點(diǎn)信息
執(zhí)行至斷點(diǎn)
