声明定义存储过程或者函数时,其中的 delimiter 关键字是干嘛的呢?

我们写 SQL 的时候,MySQL 怎么判断 SQL 是否已经结束了,可以去执行了?

需要一个结束符,当 MySQL 看到这个结束符的时候,表示可以执行前面的语句了,MySQL 默认以分号为结束符。

当我们创建存储过程或者自定义函数的时候,写了很大一片 SQL,里面包含了很多分号,但是整个代码语句是一个整体,不能让 MySQL 读到分号就立即去执行,这样肯定是不行的。我们需要完整的代码语句一起执行才行。所以此时我们就不可以用分号作为结束符了,必须另外声明结束符。

delimiter 关键字就是用来自定义结束符的,请参考下面的示例:

mysql> /*创建表test1*/
mysql> drop table IF EXISTS test1;
Query OK, 0 rows affected (0.01 sec)

mysql> create table test1(a int PRIMARY KEY,b int);
Query OK, 0 rows affected (0.01 sec)

mysql>
mysql> /*声明脚本的结束符为$$*/
mysql> DELIMITER $$
mysql> DROP PROCEDURE IF EXISTS proc1;
    -> CREATE PROCEDURE proc1()
    -> BEGIN
    ->   /*声明了一个局部变量*/
    ->   DECLARE v_a int;
    ->
    ->   select ifnull(max(a),0)+1 into v_a from test1;
    ->   select @v_b:=v_a*2;
    ->   insert into test1(a,b) select v_a,@v_b;
    -> end $$
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql>
mysql> /*声明脚本的结束符为;*/
mysql> DELIMITER ;
mysql>
mysql> /*调用存储过程*/
mysql> call proc1();
+-------------+
| @v_b:=v_a*2 |
+-------------+
|           2 |
+-------------+
1 row in set (0.00 sec)

Query OK, 1 row affected (0.01 sec)

mysql> /*查看结果*/
mysql> select * from test1;
+---+------+
| a | b    |
+---+------+
| 1 |    2 |
+---+------+
1 row in set (0.00 sec)
上一篇:Docker 方式部署 禅道


下一篇:TP6管理后台实战第七天-用户管理