旧业务需求:一个客户能够被同一个公司下的不一样用户屡次新建。sql
新业务需求:一个客户能够被同一个公司下的用户新建一次。oop
清洗旧业务遗留下来的数据,清洗规则:谁先建立客户谁保留,后面建立的通通标记为无用状态。spa
DELIMITER $$ CREATE PROCEDURE deletechongfu() BEGIN DECLARE org_id INT(11); DECLARE count_num INT; DECLARE customer_code VARCHAR(32); DECLARE customer_id VARCHAR(255); -- 遍历数据结束标志 DECLARE done INT DEFAULT FALSE; DECLARE customerCursor CURSOR FOR SELECT t1.id,t1.code,t1.org_id,COUNT(*) AS COUNT FROM (SELECT t.id,t.org_id,t.name,t.code,tc.tuser_id,tc.create_time FROM credit.hd_tuser_customer tc INNER JOIN (SELECT t.code,t.name,t.org_id,t.id FROM credit.hd_customer_user t WHERE t.status = '1') t ON tc.customer_id = t.id WHERE tc.status = '1') t1 GROUP BY t1.code,t1.org_id HAVING COUNT >1; -- 将结束标志绑定到游标 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN customerCursor; -- 开始循环 read_loop: LOOP -- 提取游标里的数据,这里只有一个,多个的话也同样; FETCH customerCursor INTO customer_id,customer_code,org_id,count_num; SET @count_total = 0; SELECT customer_id INTO @customer_id; SELECT (count_num-1) INTO @count_total; PREPARE s1 FROM 'update credit.hd_tuser_customer set status = "0" where (customer_id,tuser_id) in (SELECT tt.customer_id,tt.tuser_id FROM (select t.customer_id,t.tuser_id from credit.hd_tuser_customer t where t.customer_id = ? and t.status = "1" order by t.create_time asc limit 0,?) tt)'; EXECUTE s1 USING @customer_id,@count_total; -- 声明结束的时候 IF done THEN LEAVE read_loop; END IF; END LOOP; -- 关闭游标 CLOSE customerCursor; END$$ DELIMITER ;
在写存储过程的途中,遇到如下问题:code
1:EXECUTE s1 USING @customer_id,@count_total 这里只能是使用用户变量。字符串
2:在编写预处理语句的时候,用问号?来标记占位符。要谨记该占位符问号不能加引号或双引号,即便与字符串链接。it
3:子查询不支持limit条件限制,解决方法是在该处子查询外面再包一层子查询。class