首先mysql如何创建一个存储过程:
1.创建一个日常考核的存储过程:
drop procedure if exists pr_dailycheck;
首先判断是否存在同名的存储过程,如果存在同名的存储过程,可以将同名的存储过程删除
2.创建储存过程
create PROCEDURE pr_dailycheck()
begin
select * from audit_queue_history; -- 这是一个sql语句
end;
3.上面是比较简单的存储过程,下面我们继续将这个存储过程变的更加的复杂,复杂
如何复杂,传递一个变量,我们的目的是查找每天取号的数量,所以说我们要传递一个日期
create PROCEDURE pr_dailycheck(in daily1 VARCHAR(32))
begin
declare daily varchar(32);
SET daily=daily1;
select * from audit_queue_history where DATE_FORMAT(GETNOTIME,'%Y-%m-%d')=DATE_FORMAT(daily,'%Y-%m-%d');
end;
调用存储过程:
CALL pr_dailycheck('2018-07-16');
上面是我们向存储过程中传递一个参数,如何定义带有参数的存储过程,需要注意的是使用的关键字 是 in
4.上面是一个还算是比较简单的存储过程,我们可以在存储过程中作很多的操作,下面我们在存储过程中创建一个表,因为我们报表统计需要输出不同的很多的字段,并且每个字段的每个字段的查找都会使用到不同的数据表,我们可以如果使用left join那样可能太过麻烦,我们可以创建一个数据表,将查找的结果存放在这个临时的表里面,最后遍历这个临时的表,不就是我们想要的结果了
所以下面我们开始在存储过程里面创建数据表:
create PROCEDURE pr_dailycheck(in daily1 VARCHAR(32))
begin
declare daily varchar(32);
SET daily=daily1;
CREATE TEMPORARY TABLE IF NOT EXISTS tmpTable
(
rowguid VARCHAR(50) PRIMARY KEY,-- 主键
ouname VARCHAR(50),-- 部门名称
queuenum INT,-- 取号数
consultnum INT(50), -- 咨询答复数量
linkbnnum INT-- 关联办件的数量
);
TRUNCATE TABLE tmpTable;
select * from tmpTable;
end;
这个时候我们如果继续调用这样的调用这个存储过程,搜索的结果如下:
其实这个就是我们在存储过程里面创建的一个临时的表,但是这个表里面还没有数据,我们一个比较完整的存储过程里面应该应该存放数据,那么如何来存放数据,下面我们关心的问题便是向这个临时的表里面插入数据
5.临时表插入数据
当然我们向临时表里面插入数据也不是随便把数据插入的,我们需要在库里面查找到数据,然后插入到这个表里面
比如上面的ouname
其实在这个之前,我们有必要了解一下有游标,因为在插入数据到数据表中,我们常常会使用有游标,而且游标在存储过程中应用也是十分的广泛的,现在我们就来看一下如何来使用创建一个游标
drop procedure if exists pr_dailycheck;
create PROCEDURE pr_dailycheck(in daily1 VARCHAR(32))
begin
declare daily varchar(32);
DECLARE done INT DEFAULT FALSE;
declare ou_guid varchar(32);
declare ou_name varchar(32);
DECLARE myCursor CURSOR FOR(select ouname from frame_ou);-- 创建游标并且赋值为结果集合
DECLARE CONTINUE HANDLER for not found SET done = 1;
SET daily=daily1;
CREATE TEMPORARY TABLE IF NOT EXISTS tmpTable
(
rowguid VARCHAR(50) PRIMARY KEY,-- 主键
ouname VARCHAR(50),
queuenum INT,
consultnum INT(50),
linkbnnum INT
);
TRUNCATE TABLE tmpTable;
OPEN myCursor; -- 打开游标
myLoop: LOOP -- 开始循环体,myLoop为自定义循环名
FETCH myCursor into ou_name; -- 将游标当前读取行的数据,顺序赋予自定义变量
IF done=1 THEN -- 判断是否继续循环
LEAVE myLoop; -- 结束循环
END IF;
INSERT INTO tmpTable(rowguid,ouname) values(UUID(),ou_name);
END LOOP myLoop; -- 结束自定义循环体
CLOSE myCursor; -- 关闭游标
select * from tmpTable;
end;
上面其实是创建游标,并且给游标赋值一个结果的集合,当这些任务完成之后,这样当然是不行的我们的报表统计需要的那是相当的复杂,,我们在循环里面需要利用遍历的变量在不同的表字段里面进行查找数据,然后赋值给一个变量最后将这个这些变量作为值插入到临时表里面,我们在循环的时候,可以同时在游标里面设计两个变量:
drop procedure if exists pr_dailycheck;
create PROCEDURE pr_dailycheck(in daily1 VARCHAR(32))
begin
declare daily varchar(32);
DECLARE done INT DEFAULT FALSE;
declare ou_guid varchar(50);
declare ou_name varchar(32);
DECLARE myCursor CURSOR FOR(select ouname,ouguid from frame_ou where oucode like '%320700%');-- 创建游标并且赋值为结果集合
DECLARE CONTINUE HANDLER for not found SET done = 1;
SET daily=daily1;
CREATE TEMPORARY TABLE IF NOT EXISTS tmpTable
(
rowguid VARCHAR(50) PRIMARY KEY,-- 主键
ouname VARCHAR(50),-- 部门名称
queuenum INT,-- 取号数
consultnum INT(50), -- 咨询答复数量
linkbnnum INT-- 关联办件的数量
);
TRUNCATE TABLE tmpTable;
OPEN myCursor; -- 打开游标
myLoop: LOOP -- 开始循环体,myLoop为自定义循环名
FETCH myCursor into ou_name,ou_guid; -- 将游标当前读取行的数据,顺序赋予自定义变量
IF done=1 THEN -- 判断是否继续循环
LEAVE myLoop; -- 结束循环
END IF;
INSERT INTO tmpTable(rowguid,ouname) values(ou_guid,ou_name);
END LOOP myLoop; -- 结束自定义循环体
CLOSE myCursor; -- 关闭游标
select * from tmpTable;
end;
上面就是在游标里面涉及到了两个变量,并且ou_name和ou_guid是一一对应的
我们可以创建变量向临时的表里面输入数据:
drop procedure if exists pr_dailycheck;
create PROCEDURE pr_dailycheck(in daily1 VARCHAR(32))
begin
declare daily varchar(32);
DECLARE done INT DEFAULT FALSE;
declare ou_guid varchar(50);
declare ou_name varchar(32);
DECLARE myCursor CURSOR FOR(select ouname,ouguid from frame_ou where oucode like '%320700%');-- 创建游标并且赋值为结果集合
DECLARE CONTINUE HANDLER for not found SET done = 1;
SET daily=daily1;
CREATE TEMPORARY TABLE IF NOT EXISTS tmpTable
(
rowguid VARCHAR(50) PRIMARY KEY,-- 主键
ouname VARCHAR(50),-- 部门名称
queuenum INT,-- 取号数
consultnum INT(50), -- 咨询答复数量
linkbnnum INT-- 关联办件的数量
);
TRUNCATE TABLE tmpTable;
OPEN myCursor; -- 打开游标
myLoop: LOOP -- 开始循环体,myLoop为自定义循环名
FETCH myCursor into ou_name,ou_guid; -- 将游标当前读取行的数据,顺序赋予自定义变量
IF done=1 THEN -- 判断是否继续循环
LEAVE myLoop; -- 结束循环
END IF;
SET @rowguid=UUID();-- 也可以这样set @cnt = (select count(*) from test_tbl);
INSERT INTO tmpTable(rowguid,ouname) values(@rowguid,ou_name);
END LOOP myLoop; -- 结束自定义循环体
CLOSE myCursor; -- 关闭游标
select * from tmpTable;
end;
好了,到这个地方我们的存储过程在mysql里面基本上所有的功能都可以实现了,也许上面的描述语句不够详细,希望对你有所帮助