再来演示带有多个参数的自定义函数,现在我们通过一个函数向数据表中插入一条记录,返回值是插入id字段的类型,首先查看一下数据表的记录:
mysql> SELECT * FROM test;
+----+----------+
| id | username |
+----+----------+
| 1 | John |
| 2 | 111 |
+----+----------+
2 rows in set (0.00 sec)
接来下创建函数并插入记录:
mysql> CREATE FUNCTION adduser(username VARCHAR(20))
-> RETURNS INT UNSIGNED
-> RETURN INSERT test(username) VALUES (username);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server
version for the right syntax to use near 'test(username) VALUES (username)' at line 3
可以看到,我们还没有指定RETURN 插入记录的id类型,仅仅是准备插入一条记录后回车,却直接报错了
报错的原因是因为数据库在执行语句的过程中,是根据;来判断要执行的语句个数,而我们的自定义函数中需要包含不多个语句。但是现在一插入记录就会直接执行,简单来说,就是我们在插入记录后输入的;被系统认为已经输入完毕了,可以用DELIMITER修改MySQL的分隔符来解决这个问题:
mysql> DELIMITER //
这样以后所有的命令都要通过//来结束,当然这里的//可以设置为任意字符:
mysql> DESC test//
+----------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------------+------+-----+---------+----------------+
| id | tinyint(3) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(20) | YES | | NULL | |
+----------+---------------------+------+-----+---------+----------------+
2 rows in set (0.02 sec)
接来下再次创建自定义函数:
mysql> CREATE FUNCTION adduser(username VARCHAR(20))
-> RETURNS INT UNSIGNED
-> BEGIN
-> INSERT test(username) VALUES (username);
-> RETURN LAST_INSERT_ID();
-> END
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT adduser('Rose');
-> //
+-----------------+
| adduser('Rose') |
+-----------------+
| 3 |
+-----------------+
1 row in set (0.00 sec)
创建成功,值得注意的是,如果去掉;
mysql> CREATE FUNCTION addusers(username VARCHAR(20))
-> RETURNS INT UNSIGNED
-> BEGIN
-> INSERT test(username) VALUES (username)
-> RETURN LAST_INSERT_ID()
-> END
-> //
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'RETURN LAST_INSERT_ID()
END' at line 5
依旧是会报错的,这是执行了DELIMITER //后;代表着执行语句的结束标识,而//代表着输入语句的标识