MySQL创建存储过程(CREATE PROCEDURE)
MySQL 存儲過程是一些 SQL 語句的集合,比如有的時候我們可能需要一大串的 SQL 語句,或者說在編寫 SQL 語句的過程中還需要設(shè)置一些變量的值,這個時候我們就完全有必要編寫一個存儲過程。下面我們來介紹一下如何創(chuàng)建一個存儲過程。
?
基本語法
可以使用 CREATE PROCEDURE 語句創(chuàng)建存儲過程。
語法格式如下:
CREATE PROCEDURE <過程名> ( [過程參數(shù)[,…] ] ) <過程體>
[過程參數(shù)[,…] ] 格式
[ IN | OUT | INOUT ] <參數(shù)名> <類型>
語法說明如下:
1) 過程名
存儲過程的名稱,默認在當前數(shù)據(jù)庫中創(chuàng)建。若需要在特定數(shù)據(jù)庫中創(chuàng)建存儲過程,則要在名稱前面加上數(shù)據(jù)庫的名稱,即 db_name.sp_name。需要注意的是,名稱應當盡量避免選取與 MySQL 內(nèi)置函數(shù)相同的名稱,否則會發(fā)生錯誤。
2) 過程參數(shù)
存儲過程的參數(shù)列表。其中,<參數(shù)名>為參數(shù)名,<類型>為參數(shù)的類型(可以是任何有效的 MySQL 數(shù)據(jù)類型)。當有多個參數(shù)時,參數(shù)列表中彼此間用逗號分隔。存儲過程可以沒有參數(shù)(此時存儲過程的名稱后仍需加上一對括號),也可以有 1 個或多個參數(shù)。
MySQL 存儲過程支持三種類型的參數(shù),即輸入?yún)?shù)、輸出參數(shù)和輸入/輸出參數(shù),分別用 IN、OUT 和 INOUT 三個關(guān)鍵字標識。其中,輸入?yún)?shù)可以傳遞給一個存儲過程,輸出參數(shù)用于存儲過程需要返回一個操作結(jié)果的情形,而輸入/輸出參數(shù)既可以充當輸入?yún)?shù)也可以充當輸出參數(shù)。需要注意的是,參數(shù)的取名不要與數(shù)據(jù)表的列名相同,否則盡管不會返回出錯信息,但是存儲過程的 SQL 語句會將參數(shù)名看作列名,從而引發(fā)不可預知的結(jié)果。
3) 過程體
存儲過程的主體部分,也稱為存儲過程體,包含在過程調(diào)用的時候必須執(zhí)行的 SQL 語句。這個部分以關(guān)鍵字 BEGIN 開始,以關(guān)鍵字 END 結(jié)束。若存儲過程體中只有一條 SQL 語句,則可以省略 BEGIN-END 標志。
在存儲過程的創(chuàng)建中,經(jīng)常會用到一個十分重要的 MySQL 命令,即 DELIMITER 命令,特別是對于通過命令行的方式來操作 MySQL 數(shù)據(jù)庫的使用者,更是要學會使用該命令。
在 MySQL 中,服務器處理 SQL 語句默認是以分號作為語句結(jié)束標志的。然而,在創(chuàng)建存儲過程時,存儲過程體可能包含有多條 SQL 語句,這些 SQL 語句如果仍以分號作為語句結(jié)束符,那么 MySQL 服務器在處理時會以遇到的第一條 SQL 語句結(jié)尾處的分號作為整個程序的結(jié)束符,而不再去處理存儲過程體中后面的 SQL 語句,這樣顯然不行。為解決這個問題,通常可使用 DELIMITER 命令將結(jié)束命令修改為其他字符。
語法格式如下:
DELIMITER $$
語法說明如下:
- $$ 是用戶定義的結(jié)束符,通常這個符號可以是一些特殊的符號,如兩個“?”或兩個“¥”等。
- 當使用 DELIMITER 命令時,應該避免使用反斜杠“”字符,因為它是 MySQL 的轉(zhuǎn)義字符。
在 MySQL 命令行客戶端輸入如下SQL語句。
mysql > DELIMITER ??
成功執(zhí)行這條 SQL 語句后,任何命令、語句或程序的結(jié)束標志就換為兩個問號“??”了。
若希望換回默認的分號“;”作為結(jié)束標志,則在 MySQL 命令行客戶端輸入下列語句即可:
mysql > DELIMITER ;
注意:DELIMITER 和分號“;”之間一定要有一個空格。在創(chuàng)建存儲過程時,必須具有 CREATE ROUTINE 權(quán)限。可以使用 SHOW PROCEDURE STATUS 命令查看數(shù)據(jù)庫中存在哪些存儲過程,已經(jīng)為大家精心準備了大數(shù)據(jù)的系統(tǒng)學習資料,從Linux-Hadoop-spark-......,需要的小伙伴可以點擊若要查看某個存儲過程的具體信息,則可以使用 SHOW CREATE PROCEDURE <存儲過程名>。
創(chuàng)建不帶參數(shù)的存儲過程
【實例 1】創(chuàng)建名稱為 ShowStuScore 的存儲過程,存儲過程的作用是從學生成績信息表中查詢學生的成績信息,輸入的 SQL 語句和執(zhí)行過程如下所示。
mysql> DELIMITER // mysql> CREATE PROCEDURE ShowStuScore() -> BEGIN -> SELECT * FROM tb_students_score; -> END // Query OK, 0 rows affected (0.09 sec)創(chuàng)建存儲過程 ShowStuScore 后,通過 CALL 語句調(diào)用該存儲過程的 SQL 語句和執(zhí)行結(jié)果如下所示。
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)創(chuàng)建帶參數(shù)的存儲過程
【實例 2】創(chuàng)建名稱為 GetScoreByStu 的存儲過程,輸入?yún)?shù)是學生姓名。存儲過程的作用是通過輸入的學生姓名從學生成績信息表中查詢指定學生的成績信息,輸入的 SQL 語句和執(zhí)行過程如下所示。
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)創(chuàng)建存儲過程 GetScoreByStu 后,通過 CALL 語句調(diào)用該存儲過程的 SQL 語句和執(zhí)行結(jié)果如下所示。
mysql> DELIMITER ; mysql> CALL GetScoreByStu('Green'); +---------------+ | student_score | +---------------+ | 99 | +---------------+ 1 row in set (0.03 sec) Query OK, 0 rows affected (0.03 sec)?
總結(jié)
以上是生活随笔為你收集整理的MySQL创建存储过程(CREATE PROCEDURE)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL存储过程简介
- 下一篇: MySQL修改存储过程(ALTER PR