iT邦幫忙

DAY 16
1

只談MySQL系列 第 16

只談MySQL (第16天) Stored Procedure及Function

現在的資料庫系都供了強大的可程式化功能, 以讓使用者能夠更有彈性的運用資料庫中的各種物件, 以及資料操作, 今天我們就談談Stored Procedure及Function
CREATE PPROCEDURE指令是用來建立Stored Procedure的, 例如:

CREATE PROCEDURE dorepeat(p1 INT)
BEGIN
  SET @x = 0;
  REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
END

但是, 由於MySQL預設是以分號';'為分隔字元, 所以在MySQL中的實際情況是

mysql> CREATE PROCEDURE dorepeat(p1 INT)
    -> BEGIN
    ->   SET @x = 0;    <-- 按下[Enter]後出現誤訊息, 表示無法執行指令

為了避免這個問題, MySQL提供了DELIMITER指令來指定分隔字元, 我們可以這樣做

mysql> delimiter //    <-- 宣告雙斜線為分隔字元
mysql> CREATE PROCEDURE dorepeat(p1 INT)
    -> BEGIN
    ->   SET @x = 0;
    ->   REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
    -> END
    -> // <-- Stored Procedure建立完成

然後我們可以執行這個Stored Procedure

mysql> delimiter ;  <-- 把分隔字元改回分號
mysql> CALL dorepeat(1000);  <-- 用CALL指令執行
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @x;
+------+
| @x   |
+------+
| 1001 |  <-- 結果是1001
+------+
1 row in set (0.00 sec)

對於分隔字元, 只有一個限制: 不能使用反斜線'\', 反斜線在MySQL中是有特別用法的
對於FUNCTION, 請看以下CREATE FUNCTION的簡單例:

mysql> CREATE FUNCTION hello (s CHAR(20))
mysql> RETURNS CHAR(50) DETERMINISTIC
    -> RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT hello('world');
+----------------+
| hello('world') |
+----------------+
| Hello, world!  |
+----------------+
1 row in set (0.00 sec)

CREATE PROCEUDRE和CREATE FUNCTION的完整指令為:

CREATE
    [DEFINER = { user | CURRENT_USER }]
    PROCEDURE sp_name ([proc_parameter[,...]])
    [characteristic ...] routine_body

CREATE
    [DEFINER = { user | CURRENT_USER }]
    FUNCTION sp_name ([func_parameter[,...]])
    RETURNS type
    [characteristic ...] routine_body

明天, 我會介紹Stored Procedure及Function中的程式語言結構...


上一篇
只談MySQL (第15天) Subquery
下一篇
只談MySQL (第17天) MySQL Programming Language
系列文
只談MySQL30

尚未有邦友留言

立即登入留言