相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  儲存物件  /  定義儲存程式

27.1 定義儲存程式

每個儲存程式都包含一個由 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)