这篇博客总结了编写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 | [email protected] |
调用看返回结果
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语法、函数说明示例进行介绍。
时间: 2024-11-13 09:01:53