MySQL 8.0 参考手册 / 第25章存储对象 /
20.1 定义存储程序
每个存储的程序都包含一个由 SQL 语句组成的主体。;
该语句可能是由分号( )字符分隔的多个语句组成的复合语句。例如,以下存储过程的主体由包含一条语句的BEGIN ...
END
块
和本身包含另一条
SET
语句的循环组成
:
REPEAT
SET
Press CTRL+C to copyCREATE 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
本身解释。
Press CTRL+C to copymysql> 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
,因为函数定义不包含内部;
语句定界符:
Press CTRL+C to copymysql> 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)