MySQL呼叫儲存過程和函數

2020-07-16 10:05:29
儲存過程和儲存函數都是儲存在伺服器端的 SQL 語句集合。要想使用這些已經定義好的儲存過程和儲存函數就必須要通過呼叫的方式來實現。

儲存過程通過 CALL 語句來呼叫,儲存函數的使用方法與 MySQL 內部函數的使用方法相同。執行儲存過程和儲存函數需要擁有 EXECUTE 許可權(EXECUTE 許可權的資訊儲存在 information_schema 資料庫下的 USER_PRIVILEGES 表中)。

本節主要講解如何呼叫儲存過程和儲存函數。

呼叫儲存過程

MySQL 中使用 CALL 語句來呼叫儲存過程。呼叫儲存過程後,資料庫系統將執行儲存過程中的 SQL 語句,然後將結果返回給輸出值。

CALL 語句接收儲存過程的名字以及需要傳遞給它的任意引數,基本語法形式如下:

CALL sp_name([parameter[...]]);

其中,sp_name 表示儲存過程的名稱,parameter 表示儲存過程的引數。

例 1

下面呼叫《MySQL建立儲存過程》一節中建立的儲存過程,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)

mysql> CALL GetScoreByStu('Green');
+---------------+
| student_score |
+---------------+
|            99 |
+---------------+
1 row in set (0.03 sec)
Query OK, 0 rows affected (0.03 sec)
因為儲存過程實際上也是一種函數,所以儲存過程名後需要有( )符號,即使不傳遞引數也需要。

呼叫儲存函數

在 MySQL 中,儲存函數的使用方法與 MySQL 內部函數的使用方法是一樣的。換言之,使用者自己定義的儲存函數與 MySQL 內部函數是一個性質的。區別在於,儲存函數是使用者自己定義的,而內部函數是 MySQL 開發者定義的。

例 2

下面呼叫《MySQL建立儲存函數》一節中建立的儲存函數,SQL 語句和執行過程如下:
mysql> SELECT func_student(3);
+-----------------+
| func_student(3) |
+-----------------+
| 王五            |
+-----------------+
1 row in set (0.10 sec)
通過例 1 和例 2 的比較,可以看出雖然儲存函數和儲存過程的定義稍有不同,但它們都可以實現相同的功能,我們應該在實際應用中靈活選擇。