加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

MySQL创建函数(过程)

(2016-04-06 19:59:31)
标签:

杂谈

分类: MySQL

MySQL创建函数(过程)

在Navicat中创建函数(过程);

  1. 点击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#外部循环

    SELECT I_ORGID INTO bm FROM bm_cal_table LIMIT i,1;

    SET i = i+1;

SET j =0;

 

    WHILE j<tableCount DO

        SELECT TABLE_NAME INTO tableName FROM bm_cal_table LIMIT j,1;

        SELECT FIELD_CAL INTO fieldCal FROM bm_cal_table LIMIT j,1;

        SELECT S_JSLX INTO sJslx FROM bm_cal_table LIMIT j,1;

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语句变量

        INSERT INTO FS_ORGFUND_INFO(TASK_STATE,I_ORGID,S_BMFZR,S_JSLX,D_JSJE,D_JSSJ,S_BZ,S_TYPE) VALUES('自动统计',bm,"bmfzr",sJslx,@sum2,cur_time,'备注',1);

        SET j=j+1;

    END WHILE;#必须带分号

 

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用于定义局部变量

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有