MySQL 9.0 發行說明
每個儲存程式都包含一個由 SQL 陳述式構成的主體。此陳述式可以是複合陳述式,由以分號 (;
) 字元分隔的多個陳述式組成。例如,以下儲存程序的主體由一個 BEGIN ... END
區塊組成,其中包含一個 SET
陳述式和一個 REPEAT
迴圈,該迴圈本身又包含另一個 SET
陳述式
CREATE PROCEDURE dorepeat(p1 INT)
BEGIN
SET @x = 0;
REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
END;
如果您使用 mysql 用戶端程式來定義包含分號字元的儲存程式,則會出現問題。預設情況下,mysql 本身會將分號識別為陳述式分隔符號,因此您必須暫時重新定義分隔符號,以使 mysql 將整個儲存程式定義傳遞到伺服器。
若要重新定義 mysql 分隔符號,請使用 delimiter
命令。以下範例顯示如何對剛才顯示的 dorepeat()
程序執行此操作。分隔符號變更為 //
,以允許將整個定義作為單一陳述式傳遞到伺服器,然後在呼叫程序之前還原為 ;
。這使得程序主體中使用的 ;
分隔符號能夠傳遞到伺服器,而不是由 mysql 本身解釋。
mysql> delimiter //
mysql> CREATE PROCEDURE dorepeat(p1 INT)
-> BEGIN
-> SET @x = 0;
-> REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
-> END
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> CALL dorepeat(1000);
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @x;
+------+
| @x |
+------+
| 1001 |
+------+
1 row in set (0.00 sec)
您可以將分隔符號重新定義為 //
以外的字串,並且分隔符號可以由單一字元或多個字元組成。您應該避免使用反斜線 (\
) 字元,因為它是 MySQL 的跳脫字元。
以下是一個函數範例,該函數接受一個參數,使用 SQL 函數執行運算,並傳回結果。在這種情況下,由於函數定義不包含內部 ;
陳述式分隔符號,因此無需使用 delimiter
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)