标签:
杂谈 |
分类: MySQL |
MySQL创建函数(过程)
在Navicat中创建函数(过程);
-
点击new function按钮创建函数(过程)
http://s9/middle/004anTiPzy70HGXDuo848&690
弹出下图:
http://s9/middle/004anTiPzy70HGXGhN608&690
选择创建过程还是函数,创建步骤相似,这里以创建过程为例
选择Procedure,如下图:
http://s11/middle/004anTiPzy70HGXJ7F8da&690
如需传入参,在该页面中做相应编辑,如下图:
注:Mode:IN|OUT|INOUT:::IN,仅能从外部往过程内部传递参数,过程内部对参数的改变不影响外部;OUT,仅能从过程内部向外部传递值,不能从外部传入内部;INOUT:结合IN和OUT,过程之后影响过程内外该参数的值。
如果过程不需传递参数,直接点击Finish,注:过程不返回值,如下图:
在BEGIN和END之间输入函数代码,然后编辑Advanced、Comment、选项卡,最后点击SQL Preview预览函数,如下图:
然后点击工具栏中的【保存】按钮,输入过程名完成过程创建。
创建函数
点击Next,设置返回值类型和返回值属性,如下图
点击Finish
http://s3/middle/004anTiPzy70HGYl1Xcf2&690
http://s2/middle/004anTiPzy70HGYmiXf31&690
完。。。
函数说明
1、MySQL不支持变量做表名,简单的用set或者declare语句定义变量,然后直接作为sql的表名是不行的,mysql会把变量名当作表名,因此MySQL不支持变量做表名,解决的办法是将整条sql语句作为变量,其中穿插存表名的变量,然后调用,然后调用EXECUTE 执行这条sql语句。
2、MySQL函数中不支持数组,如何把多个值循环操作,解决的办法是将需要循环操作的值放到数据库中的一个表中,然后循环读取表中的数据获取操作值。
举例如下:一个程序的代码
CREATE PROCEDURE `CalBMZJ`()
COMMENT '每月一号凌晨一点自动计算部门资金过程'
BEGIN
DECLARE last_month VARCHAR(10);#上一个月
DECLARE last_month2 VARCHAR(10);#上一个月带%
DECLARE bmCount INT;#部门数量
DECLARE tableCount INT;#要计算的表的数量
DECLARE bm VARCHAR(5);
DECLARE tableIOrgid varchar(20);#table表对应部门字段名
DECLARE tableName VARCHAR(20);#表名
DECLARE fieldCal VARCHAR(20);#要统计的字段名
DECLARE sj varchar(10);#时间字段
DECLARE sJslx VARCHAR(20);#结算类型
DECLARE i INT DEFAULT 0;
DECLARE j INT DEFAULT 0;
DECLARE cur_time DATETIME DEFAULT NOW();#当前时间(统计时间)
SELECT DATE_FORMAT(DATE_SUB(CURDATE(),INTERVAL 1 MONTH),'%Y-%m') INTO last_month;
set last_month2= CONCAT(last_month,'%');
SELECT COUNT(I_ORGID) INTO bmCount FROM bm_cal_table;
SELECT COUNT(TABLE_NAME) INTO tableCount FROM bm_cal_table;
WHILE i< bmCount DO#外部循环
SET j =0;
SELECT FIELD_SJ INTO sj FROM bm_cal_table LIMIT j,1;
SELECT TABLE_IORGID INTO tableIOrgid FROM bm_cal_table LIMIT j,1;
SET @sum2=0;#统计用,用declare定义的不能用
set @sqlCmd = CONCAT('SELECT SUM(', fieldCal, ') INTO ', '@sum2', ' FROM ', tableName, ' WHERE ',tableIOrgid, ' IN(', bm, ') AND ', sj, ' LIKE "',last_month2,'"');
PREPARE exSql FROM @sqlCmd;#这条必须
EXECUTE exsql;#执行sql语句变量
END WHILE;
END
上边程序从数据库中的bm_cal_table表中读取需要得到的数据,通过计算表中的对应字段的记录数得到循环变量I,j的值。
3、在函数中每条语句结束都要带分号,包括循环体
4、在函数中要将查找的值赋给一个变量,需要使用INTO 关键字,如SELECT I_ORGID INTO bm FROM bm_cal_table LIMIT i,1;
5、可以使用SET语句对一个变量简单赋值,如:SET j =0;
6、DECLARE定义的局部变量在要执行的变量语句中不能够赋值,需要使用SET
定义全局变量,如:SET @sum2=0;注,在语句中直接使用未定义的全局变量也可以
7、sql语句的变量也是全局变量
8、DECLARE用于定义局部变量