深入mysql创建自定义函数与存储过程的详解

 更新时间:2013年06月10日 09:36:22   作者:  
本篇文章是对mysql创建自定义函数与存储过程进行了详细的分析介绍,需要的朋友参考下

一 创建自定义函数
在使用mysql的过程中,mysql自带的函数可能不能完成我们的业务需求,这时就需要自定义函数,例如笔者在开发过程中遇到下面这个问题:
mysql表结构如下

复制代码 代码如下:

DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `pic` varchar(50) NOT NULL,
  `hashcode` varchar(16) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of test
-- ----------------------------
INSERT INTO `test` VALUES ('1', '2012120910403250c3fa209bf48.jpg', 'bf8f83818080c0f1');
INSERT INTO `test` VALUES ('2', '2012120620430750c092db26557.JPG', 'ff9880f0f680ceff');
INSERT INTO `test` VALUES ('3', '2012120619582550c08861eb062.jpg', '7f7f004f7f7f7c7f');
INSERT INTO `test` VALUES ('4', '2012112911072650b6d16e7f21f.jpg', '7f7f004f7f7f007f');


其中pic字段为图片名称,hashcode是图片的感知哈希编码(16进制编码字符串,长度固定16位),用户输入一个hashcode,怎么从数据库中找出满足字符串对应位置的字符不同的个数小于5的记录呢?就像“11001”和“11101”对应位置不同字符不同的个数为1,比如 用户输入"7f7f004f7f7f00af",那么第三条和第四条记录是满足的,怎么实现呢?如果单纯的依靠mysql自带的函数很难完成,这时就需要建立自定义函数解决。这个问题的解决在此非常感谢csdn的acmain_chm,acmain_chm以及oschina的@梁小刚,还有@淘宝丁奇

建立自定义函数的过程如下:
1.进入mysql命令行
mysql>
2.用delimiter命令来把语句定界符从 ;变为//。这样就允许在程序体用;定界符传递到服务器,而不是被mysql自己来解释。
mysql> delimiter //
3.创建自定义函数

复制代码 代码如下:

mysql>CREATE FUNCTION hashDiff( s1 varchar(16), s2 varchar(16))
->RETURNS INT
->BEGIN
->DECLARE diff, x INT;
->SET diff =0;
->SET x = 0;
->WHILE (x  < 16 )  DO
->SET x = x+1;
->if SUBSTRING(s1, x,1)<>SUBSTRING(s2, x,1) then
->set diff=diff+ 1;
->end if;
->END WHILE;
->RETURN diff;
->END
->//
mysql>select * from test t where  hashDiff(t.hashcode,'ff9880f0f680ceff')  < 5;

二 创建存储过程
1.进入mysql命令行
mysql>
2.用delimiter命令来把语句定界符从 ;变为//。这样就允许在程序体用;定界符传递到服务器,而不是被mysql自己来解释。
mysql> delimiter //
3.创建存储过程
复制代码 代码如下:

mysql> delimiter //
mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)
    -> BEGIN
    ->   SELECT COUNT(*) INTO param1 FROM t;
    -> END
    -> //
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql> CALL simpleproc(@a);
Query OK, 0 rows affected (0.00 sec)


mysql> SELECT @a;
+------+
| @a   |
+------+
| 3    |
+------+
1 row in set (0.00 sec)


相关文章

  • PHP连接MySql闪断自动重连的方法

    PHP连接MySql闪断自动重连的方法

    当mysql连接闪断时,之后循环的执行将会失败。这篇文章主要介绍了PHP连接MySql闪断自动重连的方法,非常不错,具有参考借鉴价值,感兴趣的朋友一起学习吧
    2016-08-08
  • mysql Access denied for user ‘root’@’localhost’ (using password: YES)解决方法

    mysql Access denied for user ‘root’@’localhost’ (using p

    这篇文章主要介绍了mysql Access denied for user ‘root’@’localhost’ (using password: YES)解决方法,本文给出详细的解决步骤及操作注释,需要的朋友可以参考下
    2015-07-07
  • mysql load data infile 的用法(40w数据 用了3-5秒导进mysql)

    mysql load data infile 的用法(40w数据 用了3-5秒导进mysql)

    测试数据的时候,生成txt文件应该快点,再用这种方式导入到mysql 速度上快点。40w数据 用了3-5秒导进mysql,牛逼毁了
    2013-01-01
  • mysql 8.0.16 winx64及Linux修改root用户密码 的方法

    mysql 8.0.16 winx64及Linux修改root用户密码 的方法

    这篇文章主要介绍了mysql 8.0.16 winx64及Linux修改root用户密码 的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • mysql中异常错误ERROR:2002的解决方法

    mysql中异常错误ERROR:2002的解决方法

    最近在启动mysql的时候发现mysql报错了,错误代码是2002,通过查找相关的资料发现是var/lib/mysql 的访问权限问题,所以这篇文章主要介绍了mysql中异常错误ERROR:2002的解决方法,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-03-03
  • 如何备份MySQL数据库

    如何备份MySQL数据库

    网站数据对我们对站长来说都是最宝贵的,我们平时应该养成良好的备份数据的习惯。这样可使我们数据库崩溃造成的损失大大降低
    2015-01-01
  • MySQL中冗余和重复索引的区别说明

    MySQL中冗余和重复索引的区别说明

    这篇文章主要介绍了MySQL中冗余和重复索引的区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • 删除mysql数据表如何操作

    删除mysql数据表如何操作

    在本篇文章里小编给大家分享了关于删除mysql数据表简单方法,需要的朋友们可以参考学习下。
    2020-06-06
  • 8种MySQL分页方法总结

    8种MySQL分页方法总结

    这篇文章主要介绍了8种MySQL分页方法总结,小编现在才知道,MySQL分页竟然有8种实现方法,本文就一一讲解了这些方法,需要的朋友可以参考下
    2015-01-01
  • 讲解MySQL中<=>操作符的用法

    讲解MySQL中<=>操作符的用法

    这篇文章主要介绍了讲解MySQL中<=>操作符的用法,整理自stackoverflow的相关实际问题,需要的朋友可以参考下
    2015-04-04

最新评论