首頁  >  文章  >  資料庫  >  mysql中預存程序和儲存函數是什麼?

mysql中預存程序和儲存函數是什麼?

青灯夜游
青灯夜游原創
2020-10-15 11:36:143749瀏覽

在mysql中,預存程序和儲存函數都是資料庫中定義的一些SQL語句的集合。其中,儲存函數可以透過return語句傳回函數值,主要用於計算並傳回一個值;而預存程序沒有直接傳回值,主要用於執行操作。

mysql中預存程序和儲存函數是什麼?

(推薦教學:mysql影片教學

mysql中的預存程序

編寫預存程序並不是件簡單的事情,但是使用預存程序可以簡化操作,且減少冗餘的操作步驟,同時,還可以減少操作過程中的失誤,提高效率,因此應該盡可能的學會使用預存程序。

以下主要介紹如何建立預存程序。

可以使用CREATE PROCEDURE 語句建立預存程序,語法格式如下:

CREATE PROCEDURE <过程名> ( [过程参数[,…] ] ) <过程体>

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

[ IN | OUT | INOUT ] <参数名> <类型>

語法說明如下:

1) 過程名稱

預存程序的名稱,預設在目前資料庫中建立。若需要在特定資料庫中建立預存程序,則要在名稱前面加上資料庫的名稱,即 db_name.sp_name。

要注意的是,名稱應盡量避免選取與 MySQL 內建函數相同的名稱,否則會發生錯誤。

2) 過程參數

預存程序的參數清單。其中,696a1cf5abbd1d584a59efe5c6c38de9為參數名,efa10bd96cd333b49f1a149a6df83f3b為參數的型別(可以是任何有效的 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 權限。

mysql中的儲存函數

在MySQL 中,使用CREATE FUNCTION 語句來建立儲存函數,其語法形式如下:

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

其中:

  • sp_name 參數:表示儲存函數的名稱;

  • func_parameter:表示儲存函數的參數清單;

  • RETURNS type:指定傳回值的型別;

  • characteristic 參數:指定儲存函數的特性,該參數的取值與預存程序是一樣的;

  • routine_body 參數:表示SQL 程式碼的內容,可以用BEGIN...END 來標示SQL 程式碼的開始和結束。

注意:在具体创建函数时,函数名不能与已经存在的函数名重名。除了上述要求外,推荐函数名命名(标识符)为 function_xxx 或者 func_xxx。

func_parameter 可以由多个参数组成,其中每个参数由参数名称和参数类型组成,其形式如下:
[IN | OUT | INOUT] param_name type;

其中:

  • IN 表示输入参数,OUT 表示输出参数,INOUT 表示既可以输入也可以输出;

  • param_name 参数是存储函数的参数名称;

  • type 参数指定存储函数的参数类型,该类型可以是 MySQL 数据库的任意数据类型。

例 1

使用 CREATE FUNCTION 创建查询 tb_student 表中某个学生姓名的函数,SQL 语句和执行过程如下:

mysql> USE test;
Database changed
mysql> DELIMITER //
mysql> CREATE FUNCTION func_student(id INT(11))
    -> RETURNS VARCHAR(20)
    -> COMMENT &#39;查询某个学生的姓名&#39;
    -> BEGIN
    -> RETURN(SELECT name FROM tb_student WHERE tb_student.id = id);
    -> END //
Query OK, 0 rows affected (0.10 sec)
mysql> DELIMITER ;

上述代码中,创建了 func_student 函数,该函数拥有一个类型为 INT(11) 的参数 id,返回值为 VARCHAR(20) 类型。SELECT 语句从 tb_student 表中查询 id 字段值等于所传入参数 id 值的记录,同时返回该条记录的 name 字段值。

创建函数与创建存储过程一样,需要通过命令 DELIMITER // 将 SQL 语句的结束符由“;”修改为“//”,最后通过命令 DELIMITER ; 将结束符号修改成 SQL 语句中默认的结束符号。

如果在存储函数中的 RETURN 语句返回一个类型不同于函数的 RETURNS 子句中指定类型的值,返回值将被强制为恰当的类型。比如,如果一个函数返回一个 ENUM 或 SET 值,但是 RETURN 语句返回一个整数,对于 SET 成员集的相应的 ENUM 成员,从函数返回的值是字符串。

拓展阅读

由于存储函数和存储过程的查看、修改、删除等操作几乎相同,所以我们不再详细讲解如何操作存储函数了。

查看存储函数的语法如下:

SHOW FUNCTION STATUS LIKE 存储函数名;
SHOW CREATE FUNCTION 存储函数名;
SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME=存储函数名;

可以发现,操作存储函数和操作存储过程不同的是将 PROCEDURE 替换成了 FUNCTION。同样,修改存储函数的语法如下:

ALTER FUNCTION 存储函数名 [ 特征 ... ]

存储函数的特征与存储过程的基本一样。

以上是mysql中預存程序和儲存函數是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn