溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

mysql中存儲(chǔ)過(guò)程和存儲(chǔ)函數(shù)指的是什么

發(fā)布時(shí)間:2020-10-16 09:20:20 來(lái)源:億速云 閱讀:191 作者:小新 欄目:MySQL數(shù)據(jù)庫(kù)

小編給大家分享一下mysql中存儲(chǔ)過(guò)程和存儲(chǔ)函數(shù)指的是什么,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

在mysql中,存儲(chǔ)過(guò)程和存儲(chǔ)函數(shù)都是數(shù)據(jù)庫(kù)中定義的一些SQL語(yǔ)句的集合。其中,存儲(chǔ)函數(shù)可以通過(guò)return語(yǔ)句返回函數(shù)值,主要用于計(jì)算并返回一個(gè)值;而存儲(chǔ)過(guò)程沒(méi)有直接返回值,主要用于執(zhí)行操作。

mysql中的存儲(chǔ)過(guò)程

編寫(xiě)存儲(chǔ)過(guò)程并不是件簡(jiǎn)單的事情,但是使用存儲(chǔ)過(guò)程可以簡(jiǎn)化操作,且減少冗余的操作步驟,同時(shí),還可以減少操作過(guò)程中的失誤,提高效率,因此應(yīng)該盡可能的學(xué)會(huì)使用存儲(chǔ)過(guò)程。

下面主要介紹如何創(chuàng)建存儲(chǔ)過(guò)程。

可以使用 CREATE PROCEDURE 語(yǔ)句創(chuàng)建存儲(chǔ)過(guò)程,語(yǔ)法格式如下:

CREATE PROCEDURE <過(guò)程名> ( [過(guò)程參數(shù)[,…] ] ) <過(guò)程體>

[過(guò)程參數(shù)[,…] ] 格式

[ IN | OUT | INOUT ] <參數(shù)名> <類(lèi)型>

語(yǔ)法說(shuō)明如下:

1) 過(guò)程名

存儲(chǔ)過(guò)程的名稱(chēng),默認(rèn)在當(dāng)前數(shù)據(jù)庫(kù)中創(chuàng)建。若需要在特定數(shù)據(jù)庫(kù)中創(chuàng)建存儲(chǔ)過(guò)程,則要在名稱(chēng)前面加上數(shù)據(jù)庫(kù)的名稱(chēng),即 db_name.sp_name。

需要注意的是,名稱(chēng)應(yīng)當(dāng)盡量避免選取與 MySQL 內(nèi)置函數(shù)相同的名稱(chēng),否則會(huì)發(fā)生錯(cuò)誤。

2) 過(guò)程參數(shù)

存儲(chǔ)過(guò)程的參數(shù)列表。其中,<參數(shù)名>為參數(shù)名,<類(lèi)型>為參數(shù)的類(lèi)型(可以是任何有效的 MySQL 數(shù)據(jù)類(lèi)型)。當(dāng)有多個(gè)參數(shù)時(shí),參數(shù)列表中彼此間用逗號(hào)分隔。存儲(chǔ)過(guò)程可以沒(méi)有參數(shù)(此時(shí)存儲(chǔ)過(guò)程的名稱(chēng)后仍需加上一對(duì)括號(hào)),也可以有 1 個(gè)或多個(gè)參數(shù)。

MySQL 存儲(chǔ)過(guò)程支持三種類(lèi)型的參數(shù),即輸入?yún)?shù)、輸出參數(shù)和輸入/輸出參數(shù),分別用 IN、OUT 和 INOUT 三個(gè)關(guān)鍵字標(biāo)識(shí)。其中,輸入?yún)?shù)可以傳遞給一個(gè)存儲(chǔ)過(guò)程,輸出參數(shù)用于存儲(chǔ)過(guò)程需要返回一個(gè)操作結(jié)果的情形,而輸入/輸出參數(shù)既可以充當(dāng)輸入?yún)?shù)也可以充當(dāng)輸出參數(shù)。

需要注意的是,參數(shù)的取名不要與數(shù)據(jù)表的列名相同,否則盡管不會(huì)返回出錯(cuò)信息,但是存儲(chǔ)過(guò)程的 SQL 語(yǔ)句會(huì)將參數(shù)名看作列名,從而引發(fā)不可預(yù)知的結(jié)果。

3) 過(guò)程體

存儲(chǔ)過(guò)程的主體部分,也稱(chēng)為存儲(chǔ)過(guò)程體,包含在過(guò)程調(diào)用的時(shí)候必須執(zhí)行的 SQL 語(yǔ)句。這個(gè)部分以關(guān)鍵字 BEGIN 開(kāi)始,以關(guān)鍵字 END 結(jié)束。若存儲(chǔ)過(guò)程體中只有一條 SQL 語(yǔ)句,則可以省略 BEGIN-END 標(biāo)志。

在存儲(chǔ)過(guò)程的創(chuàng)建中,經(jīng)常會(huì)用到一個(gè)十分重要的 MySQL 命令,即 DELIMITER 命令,特別是對(duì)于通過(guò)命令行的方式來(lái)操作 MySQL 數(shù)據(jù)庫(kù)的使用者,更是要學(xué)會(huì)使用該命令。

在 MySQL 中,服務(wù)器處理 SQL 語(yǔ)句默認(rèn)是以分號(hào)作為語(yǔ)句結(jié)束標(biāo)志的。然而,在創(chuàng)建存儲(chǔ)過(guò)程時(shí),存儲(chǔ)過(guò)程體可能包含有多條 SQL 語(yǔ)句,這些 SQL 語(yǔ)句如果仍以分號(hào)作為語(yǔ)句結(jié)束符,那么 MySQL 服務(wù)器在處理時(shí)會(huì)以遇到的第一條 SQL 語(yǔ)句結(jié)尾處的分號(hào)作為整個(gè)程序的結(jié)束符,而不再去處理存儲(chǔ)過(guò)程體中后面的 SQL 語(yǔ)句,這樣顯然不行。

為解決以上問(wèn)題,通常使用 DELIMITER 命令將結(jié)束命令修改為其他字符。語(yǔ)法格式如下:

DELIMITER $$

語(yǔ)法說(shuō)明如下:

  • $$ 是用戶(hù)定義的結(jié)束符,通常這個(gè)符號(hào)可以是一些特殊的符號(hào),如兩個(gè)“?”或兩個(gè)“¥”等。

  • 當(dāng)使用 DELIMITER 命令時(shí),應(yīng)該避免使用反斜杠“\”字符,因?yàn)樗?MySQL 的轉(zhuǎn)義字符。

在 MySQL 命令行客戶(hù)端輸入如下 SQL 語(yǔ)句。

mysql > DELIMITER ??

成功執(zhí)行這條 SQL 語(yǔ)句后,任何命令、語(yǔ)句或程序的結(jié)束標(biāo)志就換為兩個(gè)問(wèn)號(hào)“??”了。

若希望換回默認(rèn)的分號(hào)“;”作為結(jié)束標(biāo)志,則在 MySQL 命令行客戶(hù)端輸入下列語(yǔ)句即可:

mysql > DELIMITER ;

注意:DELIMITER 和分號(hào)“;”之間一定要有一個(gè)空格。在創(chuàng)建存儲(chǔ)過(guò)程時(shí),必須具有 CREATE ROUTINE 權(quán)限。

mysql中的存儲(chǔ)函數(shù)

在 MySQL 中,使用 CREATE FUNCTION 語(yǔ)句來(lái)創(chuàng)建存儲(chǔ)函數(shù),其語(yǔ)法形式如下:

CREATE FUNCTION sp_name ([func_parameter[...]])
RETURNS type
[characteristic ...] routine_body

其中:

  • sp_name 參數(shù):表示存儲(chǔ)函數(shù)的名稱(chēng);

  • func_parameter:表示存儲(chǔ)函數(shù)的參數(shù)列表;

  • RETURNS type:指定返回值的類(lèi)型;

  • characteristic 參數(shù):指定存儲(chǔ)函數(shù)的特性,該參數(shù)的取值與存儲(chǔ)過(guò)程是一樣的;

  • routine_body 參數(shù):表示 SQL 代碼的內(nèi)容,可以用 BEGIN...END 來(lái)標(biāo)示 SQL 代碼的開(kāi)始和結(jié)束。

注意:在具體創(chuàng)建函數(shù)時(shí),函數(shù)名不能與已經(jīng)存在的函數(shù)名重名。除了上述要求外,推薦函數(shù)名命名(標(biāo)識(shí)符)為 function_xxx 或者 func_xxx。

func_parameter 可以由多個(gè)參數(shù)組成,其中每個(gè)參數(shù)由參數(shù)名稱(chēng)和參數(shù)類(lèi)型組成,其形式如下:
[IN | OUT | INOUT] param_name type;

其中:

  • IN 表示輸入?yún)?shù),OUT 表示輸出參數(shù),INOUT 表示既可以輸入也可以輸出;

  • param_name 參數(shù)是存儲(chǔ)函數(shù)的參數(shù)名稱(chēng);

  • type 參數(shù)指定存儲(chǔ)函數(shù)的參數(shù)類(lèi)型,該類(lèi)型可以是 MySQL 數(shù)據(jù)庫(kù)的任意數(shù)據(jù)類(lèi)型。

例 1

使用 CREATE FUNCTION 創(chuàng)建查詢(xún) tb_student 表中某個(gè)學(xué)生姓名的函數(shù),SQL 語(yǔ)句和執(zhí)行過(guò)程如下:

mysql> USE test;
Database changed
mysql> DELIMITER //
mysql> CREATE FUNCTION func_student(id INT(11))
    -> RETURNS VARCHAR(20)
    -> COMMENT '查詢(xún)某個(gè)學(xué)生的姓名'
    -> BEGIN
    -> RETURN(SELECT name FROM tb_student WHERE tb_student.id = id);
    -> END //
Query OK, 0 rows affected (0.10 sec)
mysql> DELIMITER ;

上述代碼中,創(chuàng)建了 func_student 函數(shù),該函數(shù)擁有一個(gè)類(lèi)型為 INT(11) 的參數(shù) id,返回值為 VARCHAR(20) 類(lèi)型。SELECT 語(yǔ)句從 tb_student 表中查詢(xún) id 字段值等于所傳入?yún)?shù) id 值的記錄,同時(shí)返回該條記錄的 name 字段值。

創(chuàng)建函數(shù)與創(chuàng)建存儲(chǔ)過(guò)程一樣,需要通過(guò)命令 DELIMITER // 將 SQL 語(yǔ)句的結(jié)束符由“;”修改為“//”,最后通過(guò)命令 DELIMITER ; 將結(jié)束符號(hào)修改成 SQL 語(yǔ)句中默認(rèn)的結(jié)束符號(hào)。

如果在存儲(chǔ)函數(shù)中的 RETURN 語(yǔ)句返回一個(gè)類(lèi)型不同于函數(shù)的 RETURNS 子句中指定類(lèi)型的值,返回值將被強(qiáng)制為恰當(dāng)?shù)念?lèi)型。比如,如果一個(gè)函數(shù)返回一個(gè) ENUM 或 SET 值,但是 RETURN 語(yǔ)句返回一個(gè)整數(shù),對(duì)于 SET 成員集的相應(yīng)的 ENUM 成員,從函數(shù)返回的值是字符串。

拓展閱讀

由于存儲(chǔ)函數(shù)和存儲(chǔ)過(guò)程的查看、修改、刪除等操作幾乎相同,所以我們不再詳細(xì)講解如何操作存儲(chǔ)函數(shù)了。

查看存儲(chǔ)函數(shù)的語(yǔ)法如下:

SHOW FUNCTION STATUS LIKE 存儲(chǔ)函數(shù)名;
SHOW CREATE FUNCTION 存儲(chǔ)函數(shù)名;
SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME=存儲(chǔ)函數(shù)名;

可以發(fā)現(xiàn),操作存儲(chǔ)函數(shù)和操作存儲(chǔ)過(guò)程不同的是將 PROCEDURE 替換成了 FUNCTION。同樣,修改存儲(chǔ)函數(shù)的語(yǔ)法如下:

ALTER FUNCTION 存儲(chǔ)函數(shù)名 [ 特征 ... ]

存儲(chǔ)函數(shù)的特征與存儲(chǔ)過(guò)程的基本一樣。

看完了這篇文章,相信你對(duì)mysql中存儲(chǔ)過(guò)程和存儲(chǔ)函數(shù)指的是什么有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI