文章目錄
-
一、前言
-
二、GaussDB 中的定義
-
三、存儲(chǔ)過(guò)程的使用場(chǎng)景
-
四、存儲(chǔ)過(guò)程的使用優(yōu)缺點(diǎn)
-
五、存儲(chǔ)過(guò)程的示例及示例解析
-
-
1、GaussDB 存儲(chǔ)過(guò)程語(yǔ)法格式
-
2、GaussDB 存儲(chǔ)過(guò)程語(yǔ)法示例
-
3、存儲(chǔ)過(guò)程的調(diào)用方法
-
-
七、總結(jié)
一、前言
華為云數(shù)據(jù)庫(kù) GaussDB 是一款高性能、高安全性的云原生數(shù)據(jù)庫(kù),在數(shù)據(jù)庫(kù)領(lǐng)域處于領(lǐng)先地位。而在 GaussDB 中,存儲(chǔ)過(guò)程是一個(gè)不容忽視的重要功能。本文將深入介紹 GaussDB 存儲(chǔ)過(guò)程的使用場(chǎng)景、使用優(yōu)缺點(diǎn)、示例及示例解析、調(diào)用方法等方面,為讀者提供全方位的指導(dǎo)與幫助。存儲(chǔ)過(guò)程是一個(gè)可重用的、批處理的 SQL 語(yǔ)句代碼塊,可以包含多條 SQL 語(yǔ)句,通常用于執(zhí)行復(fù)雜的數(shù)據(jù)操作、提高數(shù)據(jù)庫(kù)的性能和安全性,以及簡(jiǎn)化數(shù)據(jù)庫(kù)應(yīng)用程序的開(kāi)發(fā)和維護(hù)。在 GaussDB 中,存儲(chǔ)過(guò)程的使用可以使數(shù)據(jù)庫(kù)應(yīng)用程序更具靈活性、數(shù)據(jù)完整性更高、執(zhí)行速度更快。二、GaussDB 中的定義
商業(yè)規(guī)則和業(yè)務(wù)邏輯可以通過(guò)程序存儲(chǔ)在 GaussDB 中,這個(gè)程序就是存儲(chǔ)過(guò)程。存儲(chǔ)過(guò)程是 SQL、PL/SQL、Java 語(yǔ)句的組合。存儲(chǔ)過(guò)程使執(zhí)行商業(yè)規(guī)則的代碼可以從應(yīng)用程序中移動(dòng)到數(shù)據(jù)庫(kù)。從而,代碼存儲(chǔ)一次能夠被多個(gè)程序使用。三、存儲(chǔ)過(guò)程的使用場(chǎng)景
存儲(chǔ)過(guò)程是一種儲(chǔ)存在數(shù)據(jù)庫(kù)中的預(yù)編譯的程序,它被定義為一系列的 SQL 語(yǔ)句,并且被用來(lái)執(zhí)行一系列的數(shù)據(jù)庫(kù)操作。在實(shí)際運(yùn)用中,存儲(chǔ)過(guò)程可以提高性能、提高開(kāi)發(fā)效率,同時(shí)也具備良好的安全性能。1、下面列舉幾個(gè)存儲(chǔ)過(guò)程的適用場(chǎng)景
-
復(fù)雜任務(wù)處理:存儲(chǔ)過(guò)程可以用于一些需要處理復(fù)雜任務(wù)的場(chǎng)景,例如一個(gè)較為復(fù)雜的 SQL 語(yǔ)句,需要處理多個(gè)條件和大量的數(shù)據(jù),使用存儲(chǔ)過(guò)程可以提高效率。
-
數(shù)據(jù)持久化:存儲(chǔ)過(guò)程可以在服務(wù)器端創(chuàng)建和存儲(chǔ)處理邏輯,而客戶端通過(guò)調(diào)用存儲(chǔ)過(guò)程即可處理需要的數(shù)據(jù)。
-
數(shù)據(jù)訪問(wèn)權(quán)限管理:存儲(chǔ)過(guò)程可以通過(guò)設(shè)置不同的訪問(wèn)權(quán)限來(lái)提高數(shù)據(jù)訪問(wèn)的安全性。
2、存儲(chǔ)過(guò)程特點(diǎn): -
頻繁的、重復(fù)性、可封裝、易管理。
-
復(fù)雜的數(shù)據(jù)事務(wù)處理,可以使用存儲(chǔ)過(guò)程實(shí)現(xiàn)事務(wù)的一致性和數(shù)據(jù)完整性,同時(shí)提高執(zhí)行效率。
-
對(duì)于常用的查詢,可以把它們封裝成存儲(chǔ)過(guò)程,并將其緩存到內(nèi)存中,在每次執(zhí)行時(shí),不需要從磁盤(pán)中讀取數(shù)據(jù),提高查詢速度。
四、存儲(chǔ)過(guò)程的使用優(yōu)缺點(diǎn)
在使用存儲(chǔ)過(guò)程時(shí),我們需要充分了解其使用優(yōu)缺點(diǎn),從而在實(shí)際開(kāi)發(fā)過(guò)程中進(jìn)行有針對(duì)性的選擇,下面羅列了一些常見(jiàn)的存儲(chǔ)過(guò)程的使用優(yōu)缺點(diǎn)。1、優(yōu)點(diǎn):高效率、可復(fù)用、可維護(hù)
-
在執(zhí)行大量的操作時(shí),存儲(chǔ)過(guò)程可以減少數(shù)據(jù)庫(kù)客戶端與數(shù)據(jù)庫(kù)的通信次數(shù),從而提高了執(zhí)行效率。
-
在多次使用同一函數(shù)時(shí),存儲(chǔ)過(guò)程所需要的內(nèi)存資源和 CPU 時(shí)間較少,因此,存儲(chǔ)過(guò)程可以被看作一種可復(fù)用的數(shù)據(jù)庫(kù)對(duì)象。
-
在維護(hù)和升級(jí)方面,存儲(chǔ)過(guò)程具有良好的維護(hù)性,可以被視為一種良好的 API,簡(jiǎn)化系統(tǒng)的維護(hù)過(guò)程。
-
存儲(chǔ)過(guò)程的安全性和可維護(hù)性更高,減少了數(shù)據(jù)庫(kù)維護(hù)的工作量。
2、缺點(diǎn):難度較高、對(duì)數(shù)據(jù)庫(kù)依賴性強(qiáng) -
存儲(chǔ)過(guò)程需要使用專門(mén)的 SQL 軟件進(jìn)行開(kāi)發(fā),所以對(duì)開(kāi)發(fā)人員的技能水平要求比較高,并且使用錯(cuò)誤可能會(huì)拋出不可預(yù)知的異常。
-
存儲(chǔ)過(guò)程涉及到多個(gè)數(shù)據(jù)庫(kù)對(duì)象,使用不當(dāng)有可能產(chǎn)生不可預(yù)知的結(jié)果。當(dāng)數(shù)據(jù)庫(kù)結(jié)構(gòu)發(fā)生變化時(shí),存儲(chǔ)過(guò)程也需要進(jìn)行相應(yīng)調(diào)整,因此,存儲(chǔ)過(guò)程對(duì)數(shù)據(jù)庫(kù)的依賴性比較強(qiáng)。
-
開(kāi)發(fā)和維護(hù)存儲(chǔ)過(guò)程需要一定的技術(shù)水平,對(duì)于小型數(shù)據(jù)庫(kù)來(lái)說(shuō),使用存儲(chǔ)過(guò)程的必要性較小。
-
存儲(chǔ)過(guò)程的執(zhí)行需要對(duì)存儲(chǔ)過(guò)程進(jìn)行編譯,對(duì)于頻繁修改的存儲(chǔ)過(guò)程,可能會(huì)影響數(shù)據(jù)庫(kù)的性能。
五、存儲(chǔ)過(guò)程的示例及示例解析
1、GaussDB 存儲(chǔ)過(guò)程語(yǔ)法格式
CREATE [ OR REPLACE ] PROCEDURE procedure_name [ ( { [ argname ] [ argmode ] argtype [ { DEFAULT | := | = } expression ]}[,...]) ] [ { IMMUTABLE | STABLE | VOLATILE } | { SHIPPABLE | NOT SHIPPABLE } | {PACKAGE} | [ NOT ] LEAKPROOF | { CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT } | { [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | AUTHID DEFINER | AUTHID CURRENT_USER} | COST execution_cost | SET configuration_parameter { [ TO | = ] value | FROM CURRENT } ][ ... ] { IS | AS } plsql_body /–說(shuō)明:定義存儲(chǔ)過(guò)程,在 SQL 語(yǔ)句末,需要輸入 “/” (執(zhí)行)。參數(shù)說(shuō)明 ?OR REPLACE 當(dāng)存在同名的存儲(chǔ)過(guò)程時(shí),替換原來(lái)的定義。 ?procedure_name 創(chuàng)建的存儲(chǔ)過(guò)程名稱,可以帶有模式名。取值范圍:字符串,要符合標(biāo)識(shí)符的命名規(guī)范。 ?argmode 參數(shù)的模式。須知:VARIADIC 用于聲明數(shù)組類型的參數(shù)。取值范圍:IN,OUT,INOUT 或 VARIADIC。缺省值是 IN。只有 OUT 模式的參數(shù)后面能跟 VARIADIC。并且 OUT 和 INOUT 模式的參數(shù)不能用在 RETURNS TABLE 的過(guò)程定義中。 ?argname 參數(shù)的名稱。取值范圍:字符串,要符合標(biāo)識(shí)符的命名規(guī)范。 ?argtype 參數(shù)的數(shù)據(jù)類型??梢允褂?% ROWTYPE 間接引用表的類型,或者使用 % TYPE 間接引用表或復(fù)合類型中某一列的類型。取值范圍:可用的數(shù)據(jù)類型。 ?IMMUTABLE、STABLE 等 行為約束可選項(xiàng)。各參數(shù)的功能與 CREATE FUNCTION 類似,詳細(xì)說(shuō)明見(jiàn) CREATE FUNCTION ?plsql_body PL/SQL 存儲(chǔ)過(guò)程體。須知:當(dāng)在存儲(chǔ)過(guò)程體中進(jìn)行創(chuàng)建用戶等涉及用戶密碼相關(guān)操作時(shí),系統(tǒng)表及 csv 日志中會(huì)記錄密碼的明文。因此不建議用戶在存儲(chǔ)過(guò)程體中進(jìn)行涉及用戶密碼的相關(guān)操作。說(shuō)明:argname 和 argmode 的順序沒(méi)有嚴(yán)格要求,推薦按照 argname、argmode、argtype 的順序使用。
2、GaussDB 存儲(chǔ)過(guò)程語(yǔ)法示例
我們來(lái)看幾個(gè)具有代表性的 GaussDB 數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程示例,以進(jìn)一步了解其編寫(xiě)和使用方式。示例一: 下面是一個(gè)簡(jiǎn)單的 GaussDB 存儲(chǔ)過(guò)程示例: –創(chuàng)建一個(gè)存儲(chǔ)過(guò)程。CREATE OR REPLACE PROCEDURE prc_add ( param1 IN INTEGER, param2 IN OUT INTEGER ) AS BEGIN param2:= param1 + param2; dbe_output.print_line('result is: '||to_char(param2)); END; /–調(diào)用此存儲(chǔ)過(guò)程。
SELECT prc_add(2,3);–刪除存儲(chǔ)過(guò)程
DROP PROCEDURE prc_add;解析:上面的代碼是創(chuàng)建了一個(gè)名為 prc_add 的存儲(chǔ)過(guò)程,該存儲(chǔ)過(guò)程有兩個(gè)參數(shù),一個(gè)輸入?yún)?shù) param1 和一個(gè)輸入 / 輸出參數(shù) param2,數(shù)據(jù)類型均為整型(INTEGER)。在存儲(chǔ)過(guò)程的主體中,對(duì)輸入 / 輸出參數(shù) param2 進(jìn)行了修改,將其值賦為 param1 + param2。在調(diào)用存儲(chǔ)過(guò)程時(shí),輸入 2 作為輸入?yún)?shù) param1 的值,3 作為輸入 / 輸出參數(shù) param2 的值。最后,存儲(chǔ)過(guò)程的結(jié)果輸出到 dbe_output 控制臺(tái),顯示 “result is: 5”。總的來(lái)說(shuō),這個(gè)存儲(chǔ)過(guò)程的功能是將輸入?yún)?shù) param1 與輸入 / 輸出參數(shù) param2 的值相加,并將相加后的結(jié)果輸出。它可以在程序中多次使用,以簡(jiǎn)化代碼。示例二 –創(chuàng)建一個(gè)存儲(chǔ)過(guò)程,將帶著調(diào)用它的用戶的權(quán)限執(zhí)行。
CREATE TABLE tb1(a integer); CREATE OR REPLACE PROCEDURE insert_data(v integer) SECURITY INVOKER AS BEGIN INSERT INTO tb1 VALUES(v); END; /–調(diào)用此存儲(chǔ)過(guò)程。
CALL insert_data(123);–查看結(jié)果
select * from tb1;–刪除存儲(chǔ)過(guò)程
DROP PROCEDURE insert_data;
解析:上述代碼實(shí)際上創(chuàng)建了一個(gè)帶有一個(gè)輸入?yún)?shù)的存儲(chǔ)過(guò)程 insert_data,并將其定義為以調(diào)用者的權(quán)限來(lái)運(yùn)行。當(dāng)調(diào)用該存儲(chǔ)過(guò)程時(shí),將傳遞一個(gè)整數(shù)參數(shù)作為輸入,該參數(shù)將插入一個(gè)新行到 tb1 表中,該新行的值為該整數(shù)。然后通過(guò)執(zhí)行 select 語(yǔ)句查看 tb1 表中的所有數(shù)據(jù)行。執(zhí)行完整段代碼后,將看到只有一行數(shù)據(jù),該行的值為 123,這是由 insert_data 存儲(chǔ)過(guò)程插入的。3、存儲(chǔ)過(guò)程的調(diào)用方法
存儲(chǔ)過(guò)程的調(diào)用方法主要有兩種:通過(guò)客戶端請(qǐng)求調(diào)用和通過(guò)觸發(fā)器自動(dòng)調(diào)用。通過(guò)客戶端請(qǐng)求調(diào)用通常是手動(dòng)調(diào)用,通常使用以下兩種方法調(diào)用存儲(chǔ)過(guò)程: 1)CALL 語(yǔ)句CALL stored_procedure_name(…)2)SELECT 語(yǔ)句
SELECT stored_procedure_name(…)通過(guò)觸發(fā)器自動(dòng)調(diào)用通常是在特定操作的情況下自動(dòng)執(zhí)行存儲(chǔ)過(guò)程。例如,當(dāng)插入一條記錄時(shí),可以設(shè)置觸發(fā)器來(lái)自動(dòng)執(zhí)行存儲(chǔ)過(guò)程。
七、總結(jié)
本文詳細(xì)介紹了 GaussDB 存儲(chǔ)過(guò)程的使用場(chǎng)景、使用優(yōu)缺點(diǎn)、示例及示例解析、調(diào)用方法等內(nèi)容。使用存儲(chǔ)過(guò)程可以提高效率、可維護(hù)性,同時(shí)具備良好的安全性能。在使用存儲(chǔ)過(guò)程之前,我們需要充分了解其使用優(yōu)缺點(diǎn),從而在實(shí)際開(kāi)發(fā)過(guò)程中進(jìn)行有針對(duì)性的選擇。只有深入了解 GaussDB 的存儲(chǔ)過(guò)程的使用方法和技巧,才能在開(kāi)發(fā)過(guò)程中得心應(yīng)手,更好地配合 GaussDB 實(shí)現(xiàn)高效的數(shù)據(jù)管理和業(yè)務(wù)處理。對(duì)于需要頻繁重復(fù)執(zhí)行的 SQL 語(yǔ)句,我們可以將其封裝成一個(gè)存儲(chǔ)過(guò)程,方便管理和提高效率。當(dāng)存儲(chǔ)過(guò)程執(zhí)行達(dá)到一定規(guī)模時(shí),我們需要注意存儲(chǔ)過(guò)程的維護(hù)和優(yōu)化,以確保存儲(chǔ)過(guò)程的執(zhí)行性能。作為一個(gè)高可靠性的全球化分布式關(guān)系型數(shù)據(jù)庫(kù),華為云數(shù)據(jù)庫(kù) GaussDB 提供了豐富的存儲(chǔ)過(guò)程支持,為存儲(chǔ)過(guò)程的開(kāi)發(fā)、管理和執(zhí)行提供了更多的優(yōu)化策略和高可用性保障。本次介紹就到此,歡迎大家測(cè)試、交流!審核編輯:湯梓紅
-
存儲(chǔ)
+關(guān)注
關(guān)注
13文章
4226瀏覽量
85578 -
SQL
+關(guān)注
關(guān)注
1文章
753瀏覽量
44032 -
數(shù)據(jù)庫(kù)
+關(guān)注
關(guān)注
7文章
3752瀏覽量
64233
原文標(biāo)題:GaussDB數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程介紹
文章出處:【微信號(hào):OSC開(kāi)源社區(qū),微信公眾號(hào):OSC開(kāi)源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論