現在的資料庫系都供了強大的可程式化功能, 以讓使用者能夠更有彈性的運用資料庫中的各種物件, 以及資料操作, 今天我們就談談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中的程式語言結構...