mysql5.7 自定义序列,7-5:MySQL 创建具有复合结构函数体的自定义函数

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值