MySQL之儲存過程(PROCEDURE)

2022-09-13 09:21:10 字數 3919 閱讀 8173

在資料庫的實際操作中,並非所有操作都是針對乙個表或幾個表的單條 sql 語句那麼簡單,經常會有乙個完整的操作需要多條 sql 語句處理多個表才能完成。例如,為了確認學生能否畢業,需要同時查詢學生檔案表、成績表和綜合表,此時就需要使用多條 sql 語句來針對幾個資料表完成這個處理要求。儲存過程可以有效地完成這個資料庫操作。

儲存過程是資料庫儲存的乙個重要的功能,但是 mysql 在 5.0 以前並不支援儲存過程,這使得 mysql 在應用上大打折扣。好在 mysql 5.0 終於開始已經支援儲存過程,這樣即可以大大提高資料庫的處理速度,同時也可以提高資料庫程式設計的靈活性。

儲存過程是一組為了完成特定功能的 sql 語句集合。使用儲存過程的目的是將常用或複雜的工作預先用 sql 語句寫好並用乙個指定名稱儲存起來,這個過程經編譯和優化後儲存在資料庫伺服器中,因此稱為儲存過程。當以後需要資料庫提供與已定義好的儲存過程的功能相同的服務時,只需呼叫「call儲存過程名字」即可自動完成。

常用運算元據庫的 sql 語句在執行的時候需要先編譯,然後執行。儲存過程則採用另一種方式來執行 sql 語句。

乙個儲存過程是乙個可程式設計的函式,它在資料庫中建立並儲存,一般由 sql 語句和一些特殊的控制結構組成。當希望在不同的應用程式或平台上執行相同的特定功能時,儲存過程尤為合適。

儲存過程通常有如下優點:

1) 封裝性

儲存過程被建立後,可以在程式中被多次呼叫,而不必重新編寫該儲存過程的 sql 語句,並且資料庫專業人員可以隨時對儲存過程進行修改,而不會影響到呼叫它的應用程式源**。

2) 可增強 sql 語句的功能和靈活性

儲存過程可以用流程控制語句編寫,有很強的靈活性,可以完成複雜的判斷和較複雜的運算。

3) 可減少網路流量

由於儲存過程是在伺服器端執行的,且執行速度快,因此當客戶計算機上呼叫該儲存過程時,網路中傳送的只是該呼叫語句,從而可降低網路負載。

4) 高效能

儲存過程執行一次後,產生的二進位制**就駐留在緩衝區,在以後的呼叫中,只需要從緩衝區中執行二進位制**即可,從而提高了系統的效率和效能。

5) 提高資料庫的安全性和資料的完整性

使用儲存過程可以完成所有資料庫操作,並且可以通過程式設計的方式控制資料庫資訊訪問的許可權。

mysql儲存過程是一些 sql 語句的集合,比如有的時候我們可能需要一大串的 sql 語句,或者說在編寫 sql 語句的過程中還需要設定一些變數的值,這個時候我們就完全有必要編寫乙個儲存過程。

可以使用 create procedure 語句建立儲存過程。

語法格式如下:

create procedure 《過程名》 ( [過程引數[,…] ] ) 《過程體》

[過程引數[,…] ] 格式

[ in | out | inout ] 《引數名》 《型別》

語法說明如下:

1) 過程名

儲存過程的名稱,預設在當前資料庫中建立。若需要在特定資料庫中建立儲存過程,則要在名稱前面加上資料庫的名稱,即 db_name.sp_name。需要注意的是,名稱應當盡量避免選取與 mysql 內建函式相同的名稱,否則會發生錯誤。

2) 過程引數

儲存過程的引數列表。其中,《引數名》為引數名,《型別》為引數的型別(可以是任何有效的 mysql 資料型別)。當有多個引數時,引數列表中彼此間用逗號分隔。儲存過程可以沒有引數(此時儲存過程的名稱後仍需加上一對括號),也可以有 1 個或多個引數。

mysql 儲存過程支援三種型別的引數,即輸入引數、輸出引數和輸入/輸出引數,分別用 in、out 和 inout 三個關鍵字標識。其中,輸入引數可以傳遞給乙個儲存過程,輸出引數用於儲存過程需要返回乙個操作結果的情形,而輸入/輸出引數既可以充當輸入引數也可以充當輸出引數。需要注意的是,引數的取名不要與資料表的列名相同,否則儘管不會返回出錯資訊,但是儲存過程的 sql 語句會將引數名看作列名,從而引發不可預知的結果。

3) 過程體

儲存過程的主體部分,也稱為儲存過程體,包含在過程呼叫的時候必須執行的 sql 語句。這個部分以關鍵字 begin 開始,以關鍵字 end 結束。若儲存過程體中只有一條 sql 語句,則可以省略 begin-end 標誌。

在儲存過程的建立中,經常會用到乙個十分重要的 mysql 命令,即 delimiter 命令,特別是對於通過命令列的方式來操作 mysql 資料庫的使用者,更是要學會使用該命令。

在 mysql 中,伺服器處理 sql 語句預設是以分號作為語句結束標誌的。然而,在建立儲存過程時,儲存過程體可能包含有多條 sql 語句,這些 sql 語句如果仍以分號作為語句結束符,那麼 mysql 伺服器在處理時會以遇到的第一條 sql 語句結尾處的分號作為整個程式的結束符,而不再去處理儲存過程體中後面的 sql 語句,這樣顯然不行。為解決這個問題,通常可使用 delimiter 命令將結束命令修改為其他字元。

語法格式如下:

delimiter $$

語法說明如下:

在 mysql 命令列客戶端輸入如下sql語句。

mysql > delimiter ??

成功執行這條 sql 語句後,任何命令、語句或程式的結束標誌就換為兩個問號「??」了。

若希望換回預設的分號「;」作為結束標誌,則在 mysql 命令列客戶端輸入下列語句即可:

mysql > delimiter ;

注意:delimiter 和分號「;」之間一定要有乙個空格。在建立儲存過程時,必須具有 create routine 許可權。可以使用 show procedure status 命令檢視資料庫中存在哪些儲存過程,若要檢視某個儲存過程的具體資訊,則可以使用 show create procedure 《儲存過程名》。

【例項 1】建立名稱為 showstuscore 的儲存過程,儲存過程的作用是從學生成績資訊表中查詢學生的成績資訊,輸入的 sql 語句和執行過程如下所示。

建立儲存過程 showstuscore 後,通過 call 語句呼叫該儲存過程的 sql 語句和執行結果如下所示。

【例項 2】建立名稱為 getscorebystu 的儲存過程,輸入引數是學生姓名。儲存過程的作用是通過輸入的學生姓名從學生成績資訊表中查詢指定學生的成績資訊,輸入的 sql 語句和執行過程如下所示。

建立儲存過程 getscorebystu 後,通過 call 語句呼叫該儲存過程的 sql 語句和執行結果如下所示。

在實際開發過程中,業務需求修改的情況時有發生,這樣,不可避免的需要修改 mysql 中儲存過程的特徵 。

可以使用 alter procedure 語句修改儲存過程的某些特徵。

語法格式如下:

alter procedure 《過程名》 [ 《特徵》 … ]

修改儲存過程的內容可以通過刪除原儲存過程,再以相同的命名建立新的儲存過程。

修改儲存過程的名稱可以通過刪除原儲存過程,再以不同的命名建立新的儲存過程。

當mysql資料庫中存在廢棄的儲存過程時,我們需要將它從資料庫中刪除。

儲存過程被建立後,儲存在資料庫伺服器上,直至被刪除。可以使用 drop procedure 語句刪除資料庫中已建立的儲存過程。

語法格式如下:

drop [ if exists ] 《過程名》

語法說明如下:

1) 過程名

指定要刪除的儲存過程的名稱。

2) if exists

指定這個關鍵字,用於防止因刪除不存在的儲存過程而引發的錯誤。

注意:儲存過程名稱後面沒有引數列表,也沒有括號,在刪除之前,必須確認該儲存過程沒有任何依賴關係,否則會導致其他與之關聯的儲存過程無法執行。

刪除儲存過程 getscorebystu,檢視儲存過程的執行結果如下所示。

Mysql 之儲存過程

b 簡介 b mysql 儲存過程是從 mysql 5.0 開始逐漸增加新的功能。儲存過程可以提高資料庫的處理速度,同時也可以提高資料庫程式設計的靈活性。b 優點 b 1 儲存過程增強了sql語言的功能和靈活性。儲存過程可以用流控制語句編寫,有很強的靈活性,可以完成複雜的判斷和較複雜的運算。2 儲存...

mysql之儲存過程

mysql之儲存過程 儲存過程 注意 儲存過程名稱後面必須加括號,哪怕該儲存過程沒有引數傳遞 1.基本語法 create procedure sp name begin end修改命令結束符 delimiter 例 建立procedure create procedure myproce begin...

Mysql之儲存過程

1.進入到資料庫中檢視 是否有相關的儲存過程資料 show procedure status where db test 2.建立簡單的儲存過程 create procedure hi select hello 3.呼叫儲存過程 call hi 事例 三 mysql 儲存過程特點 建立 mysql ...