您的位置:首页 > 数据库 > MySQL

mysql存储过程、游标、自定义函数实例应用

2018-03-09 17:18 531 查看
实现功能:从表hello中根据不同的条件查询查询同一id下,个条件对应的和,把查出的4个值存入表hello1为一条数据。判断ABCD这4个字段那个值最大,把最大的值所在字段A或B或C或D赋值到本行数据的category字段中。

每个值的查询条件(用逗号隔开)时不同的,个数可能不一样,但都是用or连接的。

针对上面功能的完整sql请看后半部分(可以略过前半部分存储过程)。

前半部分

DELIMITER //

CREATE  PROCEDURE aa(IN A_In VARCHAR(32),IN B_In VARCHAR(32),IN C_In VARCHAR(32),IN D_In VARCHAR(32))
BEGIN

DECLARE n int;
DECLARE ma int;
DECLARE AValue int;
DECLARE BValue int;
DECLARE CValue int;
DECLARE DValue int;
DECLARE Category varchar(32);

-- 需要定义接收游标数据的变量 

  DECLARE idd int;

 -- 遍历数据结束标志

  DECLARE done INT DEFAULT FALSE;

  -- 游标

  DECLARE cur CURSOR FOR SELECT id FROM hello GROUP BY hello.id;

  -- 将结束标志绑定到游标

  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  -- 打开游标

  OPEN cur;

    -- 开始循环

  read_loop: LOOP

    -- 提取游标里的数据,这里只有一个,多个的话也一样;

    FETCH cur INTO idd;

    -- 声明结束的时候

    IF done THEN

      LEAVE read_loop;

    END IF; 

    -- 这里做你想做的循环的事件
set AValue=(SELECT sum(count) from hello where word like A_In and id=idd);
set BValue=(SELECT sum(count) from hello where word like B_In and id=idd);
set CValue=(SELECT sum(count) from hello where word like C_In and id=idd);
set DValue=(SELECT sum(count) from hello where word like D_In and id=idd);
set n=idd;

SELECT idd,AValue,BValue,CValue,DValue;

 INSERT INTO hello1(id,A,B,C,D)  VALUES (idd,AValue ,BValue,CValue,DValue);

set ma=(SELECT MAX(A) from  
(SELECT id, A  from hello1
union select id, B from hello1
union SELECT id, C from hello1
union SELECT id, D from hello1) b where b.id=idd) ;

set Category=(SELECT (CASE WHEN (D=ma) THEN "D" WHEN (C=ma) THEN "C" WHEN (B=ma) THEN "B"
ELSE "A" END)  from hello1 WHERE id=idd);
UPDATE hello1 set hello1.category=Category WHERE id=idd;

 END LOOP read_loop;

  -- 关闭游标

  CLOSE cur;
END

//DELIMITER ;

------------------------------------------调用这个存储过程call aa('%二%','%一%','%一%','%三%')

mysql数据库数据:见附件

关于存储过程传数组参数,处理见https://www.cnblogs.com/bigcelestial/archive/2013/09/05/3303329.html;

后半部部分

---------关于参数有可能是多个,因为sql 不支持数组--------(条件固定是or相连)--------为了傻瓜式调用我更改了原来的存储过程,并且自定义了一个函数---------------------

自定义函数:

DELIMITER //

CREATE FUNCTION str(Qualification VARCHAR(200)) RETURNS VARCHAR(500) 

BEGIN
DECLARE s VARCHAR(500);
DECLARE i int ; 
DECLARE Start1 int; 
DECLARE Length int ;
DECLARE TotalLenght int ;
set i=1;
set Start1=1;
set Length=0;
set TotalLenght=length(Qualification); -- 计算输入参数长度
#select TotalLenght; 
IF (SELECT LOCATE(',', Qualification)) THEN
set s=REPLACE(Qualification,',','\' or word = \'');
ELSE 
set s=Qualification;
END IF ;

RETURN s; 

END 

修改后的存储过程:

DELIMITER //

CREATE  PROCEDURE aa(IN A_In VARCHAR(32),IN B_In VARCHAR(32),IN C_In VARCHAR(32),IN D_In VARCHAR(32))

BEGIN

DECLARE n int;

DECLARE ma int;

DECLARE AValue int;

DECLARE BValue int;

DECLARE CValue int;

DECLARE DValue int;

DECLARE strA VARCHAR(500);

DECLARE strB VARCHAR(500);

DECLARE strC VARCHAR(500);

DECLARE strD VARCHAR(500);

DECLARE Category VARCHAR(500);

-- 需要定义接收游标数据的变量 

  DECLARE idd int;

  -- 遍历数据结束标志

  DECLARE done INT DEFAULT FALSE;

  -- 游标

  DECLARE cur CURSOR FOR SELECT id FROM hello GROUP BY hello.id;

  -- 将结束标志绑定到游标

  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

set strA=(SELECT str(A_In));

set strB=(SELECT str(B_In));

set strC=(SELECT str(C_In));

set strD=(SELECT str(D_In));

  -- 打开游标

  OPEN cur;

   -- 开始循环

  read_loop: LOOP

    -- 提取游标里的数据,这里只有一个,多个的话也一样;

    FETCH cur INTO idd;

    -- 声明结束的时候

    IF done THEN

      LEAVE read_loop;

    END IF; 

SET @Atempsql=CONCAT('SELECT sum(count) into @Acount from hello where (word = \'',strA,'\' ) and id=',idd);

    PREPARE Astmt from @Atempsql;/**预编译SQL**/

    EXECUTE Astmt;/**执行SQL**/

SET @Btempsql=CONCAT('SELECT sum(count) into @Bcount from hello where (word = \'',strB,'\' ) and id=',idd);

    PREPARE Bstmt from @Btempsql;/**预编译SQL**/

    EXECUTE Bstmt;/**执行SQL**/

SET @Ctempsql=CONCAT('SELECT sum(count) into @Ccount from hello where (word = \'',strC,'\' ) and id=',idd);

    PREPARE Cstmt from @Ctempsql;/**预编译SQL**/

    EXECUTE Cstmt;/**执行SQL**/

SET @Dtempsql=CONCAT('SELECT sum(count) into @Dcount from hello where (word = \'',strD,'\' ) and id=',idd);

    PREPARE Dstmt from @Dtempsql;/**预编译SQL**/

    EXECUTE Dstmt;/**执行SQL**/

    -- 这里做你想做的循环的事件

set AValue=(SELECT IFNULL(@Acount,0));

set BValue=(SELECT IFNULL(@Bcount,0));

set CValue=(SELECT IFNULL(@Ccount,0));

set DValue=(SELECT IFNULL(@Dcount,0));

set n=idd;

SELECT idd,AValue,BValue,CValue,DValue;

       INSERT INTO hello1(id,A,B,C,D)  VALUES (idd,AValue ,BValue,CValue,DValue);

set ma=(SELECT MAX(A) from  

(SELECT id, A  from hello1

union select id, B from hello1

union SELECT id, C from hello1

union SELECT id, D from hello1) b where b.id=idd) ;

set Category=(SELECT 

(CASE WHEN (D=ma) THEN "D" WHEN (C=ma) THEN "C" WHEN (B=ma) THEN "B"

ELSE "A" END)  from hello1 WHERE id=idd);

UPDATE hello1 set hello1.category=Category WHERE id=idd;

  END LOOP read_loop;

  -- 关闭游标

  CLOSE cur;

END

//

DELIMITER ;

调用存储过程:如call aa('一,2','一','一','三');  总共传4个参数,每个参数之间可以用逗号分隔多个条件。

-----------------------------数据库数据

SET FOREIGN_KEY_CHECKS = 0;

DROP TABLE IF EXISTS  `hello`;

CREATE TABLE `hello` (

  `id` varchar(32) DEFAULT NULL,

  `word` varchar(32) DEFAULT NULL,

  `count` bigint(20) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into `hello`(`id`,`word`,`count`) values

('0','\\','1'),('0','r','1'),('0','一','2'),('0','上','1'),('0','不','2'),('0','专业','1'),('0','两','3'),('0','个','1'),('0','中专','1'),('0','之后','1'),('0','交流','1'),('0','人','1'),('0','份','4'),('0','似乎','1'),('0','但','1'),('0','但是','1'),('0','体面','1'),('0','俊秀','1'),('0','做','5'),('0','做好','1'),('0','别人','1'),('0','到','1'),('0','到家','1'),('0','前厅','1'),('0','去年','1'),('0','参军','1'),

('0','又','1'),('0','只','1'),('0','只有','1'),('0','可','1'),('0','同样','1'),('0','后','2'),('0','外型','1'),('0','学历','1'),('0','孩子','1'),('0','家长','1'),('0','小周','3'),('0','就','1'),('0','属于','1'),('0','工作','5'),

('0','年底','1'),('0','弱','2'),('0','很','3'),('0','思路','1'),('0','性格','1'),('0','愿意','1'),('0','成就感','1'),('0','所','1'),('0','所以','1'),('0','拒绝','2'),('0','旅游','1'),('0','时间','2'),('0','明显','1'),('0','是','1'),('0','晚','1'),('0','晚上','1'),('0','月','1'),('0','有','1'),('0','服务员','1'),('0','比较','1'),('0','毕业','1'),('0','沟通','2'),('0','温和','1'),('0','点','1'),('0','理由','1'),('0','电影院','1'),('0','男','1'),('0','短','1'),('0','管理','1'),('0','而','1'),('0','能','1'),('0','能力','2'),('0','自己','1'),('0','致','1'),('0','被','2'),('0','觉得','1'),('0','认为','1'),('0','讨人喜欢','1'),('0','语速','1'),('0','跟','1'),('0','较','1'),('0','辞职','1'),('0','过','1'),

('0','还','1'),('0','这','1'),('0','这样','1'),('0','退役','2'),('0','都','2'),('0','长','1'),('0','长相','1'),('1','(','1'),('1',')','1'),('1','10','1'),('1','35','1'),('1','7','1'),('1','\\','1'),('1','r','1'),('1','一家','1'),('1','一年','1'),('1','不','1'),('1','中专','1'),('1','也','1'),('1','介绍','1'),('1','从','1'),('1','份','1'),('1','体制','1'),('1','做','2'),('1','全日制','1'),('1','公司','2'),('1','关闭','1'),('1','内向','1'),('1','再','1'),('1','单位','1'),

('1','原先','1'),('1','又','2'),('1','后','2'),('1','因','2'),('1','困难','1'),('1','在','1'),('1','失业','2'),('1','女','1'),('1','学校','1'),('1','家','1'),('1','将近','1'),('1','小陆','3'),('1','就','1'),('1','就业','1'),('1','岁','1'),

('1','工作','5'),('1','年','2'),('1','并','1'),('1','店铺','2'),('1','开业','1'),('1','当','1'),('1','性格','1'),('1','找','1'),('1','推荐','1'),('1','收银','1'),('1','收银员','1'),('1','改革','1'),('1','文静','1'),('1','新','1'),('1','朋友','1'),('1','本科','1'),('1','次','1'),('1','毕业','2'),('1','电信局','1'),('1','直到','1'),('1','相对','1'),('1','稳定','2'),('1','第一','1'),('1','第二','2'),('1','结束','1'),('1','缩小','1'),('1','而','2'),('1','规模','1'),('1','觉得','1'),('1','让','1'),('1','较','1'),('1','近','1'),('1','这家','1'),('1','这样','1'),('1','进入','1'),('1','连锁','1'),('1','通过','2'),('1','长相','1'),('1','非','1'),('2','2','1'),('2','28','1'),('2','3','1'),('2','4','1'),

('2','\\','1'),('2','l','1'),('2','r','1'),('2',' ','10'),('2','、','5'),('2','不','1'),('2','专业','1'),('2','两','1'),('2','人力资源','1'),('2','从事','1'),('2','企业','1'),('2','低','1'),('2','升迁','1'),('2','发展','1'),('2','可见','1'),

('2','名','1'),('2','周','3'),('2','国有','1'),('2','女','1'),('2','姓名','1'),('2','学历','1'),('2','小姐','2'),('2','岁','1'),('2','工作','3'),('2','工作环境','1'),('2','工资','1'),('2','年','1'),('2','年龄','1'),('2','当前','1'),

('2','待遇','1'),('2','性别','1'),('2','悠闲','1'),('2','想','1'),('2','挑战','2'),('2','接受','1'),('2','未','1'),('2','本科','1'),('2','某','2'),('2','毕业','1'),('2','没有','1'),('2','激励','1'),('2','状态','1'),('2','生涯','1'),

('2','目前','1'),('2','相对','1'),('2','知','1'),('2','经历','1'),('2','缺乏','1'),('2','职业','2'),('2','能','1'),('2','行业','1'),('2','行政','1'),('2','规划','1'),('2','较','1'),('2','过','1'),('2','遇到','1'),('2','销售','1'),

('2','问题','2'),('2','院校','1'),('2','面临','1'),('2','高校','1'),('2',';','7'),('3','3000','1'),('3','46','1'),('3','\\','1'),('3','r','1'),('3','‘','1'),('3','’','1'),('3','一','4'),('3','上','1'),('3','上班','2'),('3','下岗','1'),

('3','不是','1'),('3','不用','1'),('3','不要','2'),('3','个','1'),('3','也','2'),('3','事','1'),('3','人','4'),('3','人员','1'),('3','什么','2'),('3','今年','1'),('3','令','1'),('3','件','1'),('3','信息','1'),('3','倒','1'),('3','元','3'),

('3','准备','1'),('3','几','2'),('3','出来','1'),('3','劳动','1'),('3','十','2'),('3','单位','4'),('3','却','1'),('3','去','1'),('3','又','1'),('3','只','1'),('3','可是','1'),('3','后','1'),('3','周','2'),('3','啥','1'),('3','在','1'),

('3','基于','1'),('3','天','5'),('3','天后','1'),('3','女士','2'),('3','她','3'),('3','就','1'),('3','岁','1'),('3','岗位','1'),('3','工作','3'),('3','工资','4'),('3','干','1'),('3','应聘','1'),('3','当','1'),('3','很','1'),('3','意见','1'),

('3','成功','1'),('3','打印','1'),('3','找','1'),('3','投诉','1'),('3','招聘','1'),('3','捣','1'),('3','既然','1'),('3','是','3'),('3','最低','1'),('3','月','1'),('3','有','1'),('3','本来','1'),('3','来','1'),('3','某','1'),('3','标准','1'),

('3','此','1'),('3','没有','1'),('3','浆糊','1'),('3','班','2'),('3','理由','1'),('3','监察','1'),('3','算','1'),('3','给','1'),('3','给付','1'),('3','肯','1'),('3','营业员','1'),('3','让','2'),('3','说明','1'),('3','调出','1'),

('3','还','2'),('3','这','2'),('3','这样','1'),('3','通知','1'),('3','那','1'),('3','部门','1'),('3','钱','1'),('3','问题','1'),('3','隔','2'),('3','面试','1'),('3','高兴','1'),('3','!','1'),('3','(','1'),('3',')','1'),

('3',';','1'),('3','?','1'),('4','25','1'),('4','6月','1'),('4','\\','1'),('4','r','1'),('4','上海','1'),('4','不知道','2'),('4','专业','1'),('4','中','1'),('4','于','1'),('4','交通','1'),('4','什么','1'),('4','今年','1'),

('4','他','1'),('4','以来','1'),('4','几乎','1'),('4','及','1'),('4','哪些','1'),('4','困惑','1'),('4','在','1'),('4','大学','1'),('4','将','1'),('4','小吴','3'),('4','岁','1'),('4','工作','1'),('4','应聘','1'),

('4','感到','1'),('4','所以','1'),('4','打','1'),('4','找','1'),('4','投递','1'),('4','攻读','1'),('4','是','1'),('4','机械制造','1'),('4','正在','1'),('4','毕业','1'),('4','求职','2'),('4','没有','1'),

('4','男','1'),('4','目前','1'),('4','研究生','1'),('4','硕士','1'),('4','简历','1'),('4','职位','1'),('4','自动化','1'),('4','自己','1'),('4','让','1'),('4','该','1'),('4','过','1'),('4','?','1'),
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: