首頁 > mysql教程 閱讀:0更新時間:2020-03-28 04:08:12

MySQL創建存儲過程(CREATE PROCEDURE)

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 $$

語法說明如下:
  • $$ 是用戶定義的結束符,通常這個符號可以是一些特殊的符號,如兩個“?”或兩個“¥”等。
  • 當使用 DELIMITER 命令時,應該避免使用反斜杠“\”字符,因為它是 MySQL 的轉義字符。

在 MySQL 命令行客戶端輸入如下SQL語句。

mysql > DELIMITER ??

成功執行這條 SQL 語句后,任何命令、語句或程序的結束標志就換為兩個問號“??”了。

若希望換回默認的分號“;”作為結束標志,則在 MySQL 命令行客戶端輸入下列語句即可:

mysql > DELIMITER ;

注意:DELIMITER 和分號“;”之間一定要有一個空格。在創建存儲過程時,必須具有 CREATE ROUTINE 權限??梢允褂?SHOW PROCEDURE STATUS 命令查看數據庫中存在哪些存儲過程,若要查看某個存儲過程的具體信息,則可以使用 SHOW CREATE PROCEDURE <存儲過程名>。

創建不帶參數的存儲過程

【實例 1】創建名稱為 ShowStuScore 的存儲過程,存儲過程的作用是從學生成績信息表中查詢學生的成績信息,輸入的 SQL 語句和執行過程如下所示。
mysql> DELIMITER //
mysql> CREATE PROCEDURE ShowStuScore()
    -> BEGIN
    -> SELECT * FROM tb_students_score;
    -> END //
Query OK, 0 rows affected (0.09 sec)
創建存儲過程 ShowStuScore 后,通過 CALL 語句調用該存儲過程的 SQL 語句和執行結果如下所示。
mysql> DELIMITER ;
mysql> CALL ShowStuScore();
+--------------+---------------+
| student_name | student_score |
+--------------+---------------+
| Dany         |            90 |
| Green        |            99 |
| Henry        |            95 |
| Jane         |            98 |
| Jim          |            88 |
| John         |            94 |
| Lily         |           100 |
| Susan        |            96 |
| Thomas       |            93 |
| Tom          |            89 |
+--------------+---------------+
10 rows in set (0.00 sec)
Query OK, 0 rows affected (0.02 sec)

創建帶參數的存儲過程

【實例 2】創建名稱為 GetScoreByStu 的存儲過程,輸入參數是學生姓名。存儲過程的作用是通過輸入的學生姓名從學生成績信息表中查詢指定學生的成績信息,輸入的 SQL 語句和執行過程如下所示。
mysql> DELIMITER //
mysql> CREATE PROCEDURE GetScoreByStu
    -> (IN name VARCHAR(30))
    -> BEGIN
    -> SELECT student_score FROM tb_students_score
    -> WHERE student_name=name;
    -> END //
Query OK, 0 rows affected (0.01 sec)
創建存儲過程 GetScoreByStu 后,通過 CALL 語句調用該存儲過程的 SQL 語句和執行結果如下所示。
mysql> DELIMITER ;
mysql> CALL GetScoreByStu('Green');
+---------------+
| student_score |
+---------------+
|            99 |
+---------------+
1 row in set (0.03 sec)
Query OK, 0 rows affected (0.03 sec)

beylze編程學院,一個分享編程知識和seo優化知識的網站。跟著beylze一起學習,每天都有進步。

通俗易懂,深入淺出,一篇文章只講一個知識點。

文章不深奧,不需要鉆研,在公交、在地鐵、在廁所都可以閱讀,隨時隨地漲姿勢。

文章不涉及代碼,不燒腦細胞,人人都可以學習。

當你決定關注beylze(公眾號:beylze),你已然超越了90%的其他從業者!

相關文章

国产亚洲欧美日韩