再来演示带有多个参数的自定义函数,现在我们通过一个函数向数据表中插入一条记录,返回值是插入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 //后;代表着执行语句的结束标识,而//代表着输入语句的标识
请登录之后再进行评论