深入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)


相关文章

  • MySQL修改密码的四种方式详解

    MySQL修改密码的四种方式详解

    文章介绍了4种修改MySQL密码的方法,包括使用setpassword命令、mysqladmin命令、修改user表以及忘记密码时的处理步骤,感兴趣的朋友一起看看吧
    2025-03-03
  • MySQL中安装样本数据库Sakila过程分享

    MySQL中安装样本数据库Sakila过程分享

    这篇文章主要介绍了MySQL中安装样本数据库Sakila过程分享,Sakila数据库主要用来做一些基本的操作以及压力测试等,需要的朋友可以参考下
    2014-10-10
  • mysql如何删除数据表和关联的数据表删除详情

    mysql如何删除数据表和关联的数据表删除详情

    这篇文章主要介绍了mysql如何删除数据表和关联的数据表删除详情,删除数据表的时候,表的定义和表中所有的数据均会被删除。因此,在进行删除操作前,最好对表中的数据做一个备份,以免造成无法挽回的后果
    2022-07-07
  • 简单了解MySQL SELECT执行顺序

    简单了解MySQL SELECT执行顺序

    MySQL数据据库中我们经常使用SQL SELECT语句来查询数据,那么关于它的执行顺序,下面小编来带大家简单了解一下
    2019-05-05
  • SELECT * 效率低原理解析

    SELECT * 效率低原理解析

    这篇文章主要为大家介绍了SELECT * 效率低原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • mysql添加备注信息的实现

    mysql添加备注信息的实现

    这篇文章主要介绍了mysql添加备注信息的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • MySQL中关于null值的一个小问题

    MySQL中关于null值的一个小问题

    这篇文章主要介绍了MySQL中关于null值的一个小问题,帮助大家更好的理解和学习使用MySQL,感兴趣的朋友可以了解下
    2021-03-03
  • Mysql如何删除数据库表中的某一列

    Mysql如何删除数据库表中的某一列

    这篇文章主要介绍了Mysql如何删除数据库表中的某一列,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • mysql 循环批量插入的实例代码详解

    mysql 循环批量插入的实例代码详解

    本文通过实例代码文字相结合的形式给大家介绍了mysql 循环批量插入功能,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • MySQL做读写分离提高性能缓解数据库压力

    MySQL做读写分离提高性能缓解数据库压力

    这篇文章主要为大家介绍了MySQL做读写分离提高性能缓解数据库压力的技巧详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05

最新评论