• 中文
    • English
  • 注册
  • 赞助本站

    • 支付宝
    • 微信
    • QQ

    感谢一直支持本站的所有人!

    • 查看作者
    • 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 //后;代表着执行语句的结束标识,而//代表着输入语句的标识

    • 1
    • 0
    • 0
    • 4.3k
    • 梁兴健

      请登录之后再进行评论

      登录
    • 做任务
    • 实时动态
    • 偏好设置
    • 返回顶部
    • 单栏布局 侧栏位置: