码迷,mamicode.com
首页 > 数据库 > 详细

编写MySQL存储存储函数

时间:2015-10-29 13:08:34      阅读:296      评论:0      收藏:0      [点我收藏+]

标签:

这篇博客总结了编写MySQL存储函数(function)的过程、调试思路、总结及参考资料。

0、准备

建立测试数据库

CREATE DATABASE IF NOT EXISTS `funcdemo`;

1、编写

首先写好function框架,定义好参数返回值类型

USE funcdemo;
DELIMITER ;
DELIMITER $$

CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50)
BEGIN
    RETURN CONCAT(‘Hello, ‘,s,‘!‘);
END$$

命令行登录MySQL

mysql -uroot -proot;

在MySQL命令行导入脚本funcdemo.sql

source C:/sql/funcdemo.sql

注意:这里可能会报告脚本中的错误,修改后再重新导入。

导入成功结果如下:

mysql> source C:/sql/funcdemo.sql;
Query OK, 1 row affected, 1 warning (0.00 sec)

Database changed
Query OK, 0 rows affected, 1 warning (0.00 sec)

Query OK, 0 rows affected, 1 warning (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

查看已创建的function

mysql> use funcdemo;
Database changed
mysql> show function status;

可以看到已创建的函数

| funcdemo                 | hello                  | FUNCTION | root@localhost |

调用看返回结果

mysql> select hello(‘functest‘);
+-------------------+
| hello(‘functest‘) |
+-------------------+
| Hello, functest!  |
+-------------------+
1 row in set (0.00 sec)

2、编写业务逻辑

编写业务逻辑,比如加入字符串长度判断

BEGIN
    IF LENGTH(s) > 10 THEN
      RETURN CONCAT(‘input string too long!‘);
    ELSE
      RETURN CONCAT(‘Hello‘, s, ‘!‘);
END$$

重新用source命令导入,再次执行:

mysql> source C:/sql/funcdemo.sql;
Query OK, 1 row affected, 1 warning (0.00 sec)

Database changed
Query OK, 0 rows affected, 1 warning (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> select hello(‘functestverylonglong‘);
+-------------------------------+
| hello(‘functestverylonglong‘) |
+-------------------------------+
| input string too long!        |
+-------------------------------+
1 row in set (0.00 sec)

3、调试

存储函数不能像存储函数那样用 select varname; 来查看参数,但是可以通过临时表的方式查看。

创建临时表,插入要查看的参数:

CREATE TEMPORARY TABLE IF NOT EXISTS `tmp` (
  value CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin
);
DELETE FROM tmp;
INSERT INTO tmp (value) VALUES(s);

重新导入后,执行函数再查看临时表:

mysql> select hello(‘functest‘);
+-------------------+
| hello(‘functest‘) |
+-------------------+
| Hellofunctest!    |
+-------------------+
1 row in set (0.01 sec)

mysql> select * from tmp;
+----------+
| value    |
+----------+
| functest |
+----------+
1 row in set (0.00 sec)

4、总结

第一次编写存储函数遇到了很多问题:

- 用navicat客户端经常遇到因为语法不对丢失内容问题,后来采用命令行解决。
- source命令导入脚本,遇到路径问题,报告脚本不存在:windows环境下,需要用 / 替换默认的 \ 作为路径分隔符。
- 存储函数前后要定义分隔符 DELIMITER;默认分隔符是 ; 在存储函数前要改为 $$,导入结束要改为 ;

DELIMITER ;
DELIMITER $$
BEGIN
- - 存储函数定义
END$$
DELIMITER ;

- 如何对定义的参数进行类型转换、查找MySQL自带的字符串、日期等函数。
- 终端下查看的中文乱码:set names gb2312;
- 用show命令查看已定义的数据库、表、函数:

show databases;
show tables;
show function status;

- 用show命令查看创建,在show命令后加入CREATE参数:

mysql> show create database funcdemo;
+----------+-------------------------------------------------------------------+
| Database | Create Database                                                   |
+----------+-------------------------------------------------------------------+
| funcdemo | CREATE DATABASE `funcdemo` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+-------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> show create table t;
+-------+-------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                            |
+-------+-------------------------------------------------------------------------------------------------------------------------+
| t     | CREATE TABLE `t` (
  `c` char(20) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> show create function hello;

- 用mysqldump带 --opt -R 参数导出数据库和存储函数

>mysqldump -proot -uroot --opt -R funcdemo > c:/sql/backup.sql

多看,多写,多调试,多总结。

本文的示例脚本可以在这里下载。

下一篇会介绍如何使用MySQL官方文档查看SQL语法、函数说明示例进行介绍。

编写MySQL存储存储函数

标签:

原文地址:http://www.cnblogs.com/tangyouhua/p/4919466.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!