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 <存儲過程名稱>。
建立不帶參數的預存程序
預存程序的作用是從學生成績資訊表中查詢學生的成績訊息,輸入的SQL 語句和執行過程如下所示。
mysql> DELIMITER // mysql> CREATE PROCEDURE ShowStuScore() -> BEGIN -> SELECT * FROM tb_students_score; -> END // Query OK, 0 rows affected (0.09 sec)
以上是mysql預存程序怎麼寫的詳細內容。更多資訊請關注PHP中文網其他相關文章!