mysql 动态存储过程

##⚠️ DELIMITER // 是定义多个sql的分隔符。DELIMITER , 就是分隔符是,

##oracle 加字段
ALTER table T_NEW_HIS_KDDELIVEREXP add ISSUCCESS VARCHAR2(30);

##建表语句  his

DELIMITER //
drop procedure if EXISTS pro_createTable_his;//
    create PROCEDURE pro_createTable_his()
    begin
        DECLARE var_tname varchar(50);
        DECLARE sql_create varchar(1000);
        declare done int default false;
        DECLARE cur CURSOR FOR SELECT tablename from t_his_table_city; 
        declare continue HANDLER for not found set done = true;

        open cur;
        
        fetch cur into var_tname;
        while (not done) do
            SET sql_create= CONCAT("CREATE TABLE if not EXISTS ",var_tname,"(
    ID VARCHAR(40) NOT NULL COMMENT '唯一ID',
    APPNUM VARCHAR(30) COMMENT '运单号', 
    STATIONCODE VARCHAR(40) COMMENT '站点编码', 
    PROVINCE VARCHAR(45) COMMENT '省份code', 
    CITY VARCHAR(45) COMMENT '城市code', 
    COUNTY VARCHAR(45) COMMENT '区县code', 
    ADDRESSDETAILS VARCHAR(500) COMMENT '地址其他信息', 
    CREATETIME datetime not null Default CURRENT_TIMESTAMP  COMMENT '创建时间', 
    MODIFYTIME datetime not null Default CURRENT_TIMESTAMP COMMENT '修改时间', 
    CUSTNAME VARCHAR(300) COMMENT '客户名称', 
    PHONE VARCHAR(120) COMMENT '手机号码', 
    TEL VARCHAR(120) COMMENT '电话号码', 
    APPCREATETIME datetime COMMENT '开单时间', 
    FREQUENCY int(2) DEFAULT 0 COMMENT '次数', 
    ISSUCCESS VARCHAR(30) COMMENT '是否成功同步到es,初始时为空,同步后改为Y',  
    PRIMARY KEY (ID),
    INDEX IDX_ADDRESSDETAILS(ADDRESSDETAILS),
    INDEX IDX_STATIONCODE (STATIONCODE),
    INDEX IDX_PROVINCE_CITY_COUNTY_ADDRESSDETAILS (PROVINCE, CITY, COUNTY, ADDRESSDETAILS)
    )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");
     ##select sql_create;
            set @sql = sql_create;
      prepare s1 from @sql;
      execute s1;
            FETCH cur into var_tname;
        end WHILE;

        CLOSE cur;
    end;//
        
        call pro_createTable_his();
        
        
##建表语句  seg

DELIMITER //
drop procedure  if EXISTS pro_createTable_seg;//
    create PROCEDURE pro_createTable_seg()
    begin
        DECLARE var_tname varchar(50);
        DECLARE sql_create varchar(1000);
        declare done int default false;
        DECLARE cur CURSOR FOR SELECT tablename from t_seg_table_city; 
        declare continue HANDLER for not found set done = true;

        open cur;
        
        fetch cur into var_tname;
        while (not done) do
            SET sql_create= CONCAT("CREATE TABLE if not EXISTS ",var_tname,"(
    ID VARCHAR(50) NOT NULL  COMMENT '唯一ID',
    PROVINCE VARCHAR(50) COMMENT '省份',
    PROVINCECODE VARCHAR(50) COMMENT '省份code',    
    CITY VARCHAR(50) COMMENT '城市', 
    CITYCODE VARCHAR(50) COMMENT '城市code', 
    COUNTY VARCHAR(50) COMMENT '区县', 
    COUNTYCODE VARCHAR(50) COMMENT '区县code', 
    TOWN VARCHAR(50) COMMENT '镇名称', 
    TOWNCODE VARCHAR(50) COMMENT '镇code', 
    KEYCODE         VARCHAR(500) not null COMMENT '查询用Key数据,唯一索引,例: 区编码|路|号 或 区编码|路|地标 等',
  BIZCODE      VARCHAR(100) not null COMMENT '业务部门编码',
  KEYTYPE      VARCHAR(50) not null COMMENT 'key数据类型, 例: 路+号 或 路+地标',
  MATCHTYPE    VARCHAR(50) not null COMMENT '历史经验匹配类型,与地址匹配类型一致',
  CREATEDATE   datetime not null Default CURRENT_TIMESTAMP  COMMENT '创建时间',
  MODIFYDATE   datetime not null Default CURRENT_TIMESTAMP  COMMENT '修改时间',
    ISSUCCESS VARCHAR(30) COMMENT '是否成功同步到es,初始时为空,同步后改为Y',  
    PRIMARY KEY (ID)
    )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");
     ##select sql_create;
            set @sql = sql_create;
      prepare s1 from @sql;
      execute s1;
            FETCH cur into var_tname;
        end WHILE;

        CLOSE cur;
    end;//
        
        call pro_createTable_seg();
        
        
##建表语句 seg 添加index
 
DELIMITER //
drop procedure pro_createTable_index;//
    create PROCEDURE pro_createTable_index()
    begin
        DECLARE var_tname varchar(50);
                DECLARE sql_index varchar(1000);
                DECLARE sql_index2 varchar(1000);
                DECLARE sql_index3 varchar(1000);
                DECLARE sql_index4 varchar(1000);
                DECLARE sql_index5 varchar(1000);
                DECLARE sql_index6 varchar(1000);
        declare done int default false;
        DECLARE cur CURSOR FOR SELECT tablename from t_seg_table_city;  
        declare continue HANDLER for not found set done = true;

        open cur;
        
        fetch cur into var_tname;
        while (not done) do
        SET sql_index= CONCAT("ALTER  TABLE  ",var_tname,"  ADD  INDEX IDX_PROVINCECODE_CITYCODE_COUNTYCODE (PROVINCECODE, CITYCODE, COUNTYCODE);"
        
    );
     ##select sql_index;
        
        set @sql = sql_index;
   prepare s1 from @sql;
   execute s1;
     
     SET sql_index2= CONCAT(
        "ALTER  TABLE  ",var_tname,"  ADD  INDEX IDX_PROVINCE_CITY_COUNTY (PROVINCE, CITY, COUNTY);"
    );
    ## select sql_index2;
        
     set @sql = sql_index2;
   prepare s2 from @sql;
   execute s2;
     
     SET sql_index3= CONCAT(
        "ALTER  TABLE  ",var_tname,"  ADD  INDEX IDX_BIZCODE_KEY (BIZCODE, KEYCODE,CREATEDATE,CITYCODE);"
    );
     ##select sql_index3;
        
     set @sql = sql_index3;
   prepare s2 from @sql;
   execute s2;
     
      SET sql_index4= CONCAT(
        "ALTER  TABLE  ",var_tname,"  ADD  INDEX IDX_COUNTYCODE (COUNTYCODE);"
    );
    ## select sql_index4;
        
     set @sql = sql_index4;
   prepare s2 from @sql;
   execute s2;

 SET sql_index5= CONCAT(
        "ALTER  TABLE  ",var_tname,"  ADD  INDEX IDX_KEY_MATCHTYPE (KEYCODE, MATCHTYPE);"
    );
    ## select sql_index5;
        
     set @sql = sql_index5;
   prepare s2 from @sql;
   execute s2;
     
     SET sql_index6= CONCAT(
        "ALTER  TABLE  ",var_tname,"  ADD  INDEX IDX_MODIFYDATE (MODIFYDATE);"
    );
     ##select sql_index6;
        
     set @sql = sql_index6;
   prepare s2 from @sql;
   execute s2;

     
     
            FETCH cur into var_tname;
        end WHILE;

        CLOSE cur;
    end;//
        
        call pro_createTable_index();
        
##建中间表 seg----

CREATE TABLE if not EXISTS t_seg_table_city (
  id int(50) NOT NULL auto_increment COMMENT '唯一ID',
  tablename varchar(50) NOT NULL COMMENT '表名',
  city varchar(50) NOT NULL COMMENT '市',
    active int(3) NOT NULL COMMENT '有效',
    CREATETIME datetime not null Default CURRENT_TIMESTAMP COMMENT '创建时间',
    MODIFYTIME datetime not null Default CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (id),
  INDEX index_city(city),
  INDEX index_city_tablename(city,tablename)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


##建中间表  his----

CREATE TABLE if not EXISTS t_his_table_city (
  id int(50) NOT NULL auto_increment COMMENT '唯一ID',
  tablename varchar(50) NOT NULL COMMENT '表名',
  city varchar(50) NOT NULL COMMENT '市',
    active int(3) NOT NULL COMMENT '有效',
    CREATETIME datetime not null Default CURRENT_TIMESTAMP COMMENT '创建时间',
    MODIFYTIME datetime not null Default CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (id),
  INDEX index_city(city),
  INDEX index_city_tablename(city,tablename)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

        
        
#建删除表 -----
CREATE TABLE if not EXISTS t_delete_deptcode(
  id INT(50) NOT NULL auto_increment COMMENT '唯一ID',
  deletecode varchar(50) NOT NULL COMMENT '部门code',
  tablehis varchar(50) NOT NULL COMMENT '对应历史经验表名',
    tableseg varchar(50) NOT NULL COMMENT '对应分词表名',
    CREATETIME datetime not null Default CURRENT_TIMESTAMP COMMENT '创建时间',
    MODIFYTIME datetime not null Default CURRENT_TIMESTAMP COMMENT '修改时间',
    isdelete int(10) not null DEFAULT 0,
    DELETE_HIS_COUNT VARCHAR(10) DEFAULT 0 COMMENT '本次已删除记录数', 
  DELETE_SEG_COUNT VARCHAR(10) DEFAULT 0 COMMENT '本次已删除分词记录数',  
  PRIMARY KEY (id),
 INDEX idx_deletecode_tablehis(deletecode,tablehis),
 INDEX idx_deletecode_tableseg(deletecode,tableseg)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


#建营业部与市、表名对照表  java用 
CREATE TABLE if not EXISTS t_deptcode_city(
  id INT(50) NOT NULL auto_increment COMMENT '唯一ID',
  deptcode varchar(50) NOT NULL COMMENT '部门code',
    citycode varchar(50) NOT NULL COMMENT '市code',
 ## tablehis varchar(50) NOT NULL COMMENT '对应表名',
    ##tableseg varchar(50) NOT NULL COMMENT '对应表名',
    CREATETIME datetime not null Default CURRENT_TIMESTAMP COMMENT '创建时间',
    MODIFYTIME datetime not null Default CURRENT_TIMESTAMP COMMENT '修改时间',
    isdelete int(10) not null DEFAULT 0 COMMENT '记录有效性',
  PRIMARY KEY (id),
  ##INDEX idx_deletecode_tablehis(deletecode,tablehis),STATIONCODE
    ##INDEX idx_deletecode_tableseg(deletecode,tableseg)
    INDEX idx_deptcode_modifytime(deptcode,MODIFYTIME)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


##删除存储过程 — - 加isdelete 字段   可用java替换执行
DELIMITER //
DROP PROCEDURE IF EXISTS pro_execute_4;//
create PROCEDURE pro_execute_4() 
    begin
                DECLARE var_id varchar(50);
        DECLARE var_namehis varchar(50);
                 DECLARE var_nameseg varchar(50);
                DECLARE var_code varchar(50);
        DECLARE sql_deletehis varchar(1000);
                DECLARE sql_deleteseg varchar(1000);
                DECLARE sql_updatehis varchar(1000);
                DECLARE sql_updateseg varchar(1000);
                DECLARE counthis INT(20) DEFAULT 0;
                DECLARE countseg INT(20) DEFAULT 0;
        declare done int default false;
                ##查询删除中间表需删除deptCode+tableName
            DECLARE cur CURSOR FOR SELECT tablehis,tableseg,deletecode,id FROM t_delete_deptcode WHERE isdelete=0;
        declare continue HANDLER for not found set done = true;
        open cur;
        fetch cur into var_namehis,var_nameseg,var_code,var_id;
        while (not done) do
                        ##删除历经经验表数据
            SET sql_deletehis= CONCAT("DELETE FROM ",var_namehis," WHERE STATIONCODE = '",var_code,"';");
                        ##SELECT sql_deletehis;
                        set @sql = sql_deletehis;
                         prepare s1 from @sql;
                        start transaction;
                        execute s1;
                        ##一定要在commit之前!!!
                        set @cnthis  = ROW_COUNT(); 
                        ##SELECT @cnthis;
                        SELECT @cnthis   into counthis;
                        commit;
                        ##释放预处理字段
                        DEALLOCATE PREPARE s1;
                        
                     ##修改中间表isdelete字段
                     SET sql_updatehis= CONCAT("UPDATE t_delete_deptcode set isdelete = 1,DELETE_HIS_COUNT = '",counthis,"' WHERE id =  '",var_id,"';");
                     ##SELECT sql_updatehis;
                     set @sql = sql_updatehis;
                         prepare s2 from @sql;
                     start transaction;
                     execute s2;
                     commit;
                     DEALLOCATE PREPARE s2;
            
                         ##删除分词数据
           SET sql_deleteseg= CONCAT("DELETE FROM ",var_nameseg," WHERE BIZCODE =  '",var_code,"';");
                 ##SELECT sql_deleteseg;
                 set @sql = sql_deleteseg;
                         prepare s3 from @sql;
                     start transaction;
                     execute s3;
                    set @cntseg  = ROW_COUNT() ; 
                     ##SELECT @cntseg;
                     commit;
                    ##SELECT countseg;
                     ##释放预处理字段
                     DEALLOCATE PREPARE s3;
                     ##受影响值为0!!!
                ##    set @cntseg  = ROW_COUNT() ; 
                ##    SELECT @cntseg;
                ##        SELECT @cntseg  into countseg;
                    ##在释放预处理sql前后都可 DEALLOCATE PREPARE s3;无关
                      SELECT @cntseg  into countseg;
                     ##修改中间表isdelete字段
                     SET sql_updateseg= CONCAT("UPDATE t_delete_deptcode set isdelete = 1,DELETE_SEG_COUNT = '",countseg,"' WHERE id =  '",var_id,"';");
                  ## SELECT sql_updateseg;
                     set @sql = sql_updateseg;
                         prepare s4 from @sql;
                     start transaction;
                     execute s4;
                     commit;
                     DEALLOCATE PREPARE s4;
                
            fetch cur into var_namehis,var_nameseg,var_code,var_id;
        end WHILE;
        CLOSE cur;
    end;//
        
    #执行
    call pro_execute_4();
    
    
##删除存储过程 — - 加isdelete 字段  定时---          可用java替换执行
SET GLOBAL event_scheduler = 1;

DROP EVENT IF EXISTS  e_test;//
CREATE EVENT e_test
on schedule EVERY 1 DAY STARTS date_add(date( ADDDATE(curdate(),1)),interval 3 hour) 
##ON SCHEDULE EVERY 1 DAY  STARTS TIMESTAMP date_add(date( ADDDATE(curdate(),1)),interval 3 hour) 
ON COMPLETION PRESERVE
DO
BEGIN
call pro_execute_4();
END;
    
    

##同步语句  his 按市同步

DELIMITER //
drop procedure if EXISTS pro_sync_his;//
    create PROCEDURE pro_sync_his()
    begin
        DECLARE var_tablename varchar(50);
                DECLARE var_city varchar(50);
        DECLARE sql_sync varchar(1000);
        declare done int default false;
        DECLARE cur CURSOR FOR SELECT city,tablename from t_his_table_city; 
        declare continue HANDLER for not found set done = true;
        open cur;
        fetch cur into var_city,var_tablename;
        while (not done) do
           SET sql_sync= CONCAT("INSERT into ",var_tablename,"(ID,APPNUM,STATIONCODE,PROVINCE,CITY,COUNTY,ADDRESSDETAILS,CREATETIME,MODIFYTIME,CUSTNAME,PHONE,TEL,APPCREATETIME,FREQUENCY,ISSUCCESS)
        SELECT 
        ID,APPNUM,STATIONCODE,PROVINCE,CITY,COUNTY,ADDRESSDETAILS,CREATETIME,MODIFYTIME,CUSTNAME,PHONE,TEL,APPCREATETIME,FREQUENCY,ISSUCCESS  
                FROM T_NEW_HIS_KDDELIVEREXP
             WHERE city = '",var_city,"';");
     select sql_sync;
          set @sql = sql_sync;
      prepare s1 from @sql;
      execute s1;
            FETCH cur into var_city,var_tablename;
        end WHILE;

        CLOSE cur;
    end;//
        
        call pro_sync_his();
        
        
##同步语句  seg 按市同步

DELIMITER //
drop procedure if EXISTS pro_sync_seg;//
    create PROCEDURE pro_sync_seg()
    begin
        DECLARE var_tablename varchar(50);
                DECLARE var_city varchar(50);
        DECLARE sql_sync varchar(1000);
        declare done int default false;
        DECLARE cur CURSOR FOR SELECT city,tablename from t_seg_table_city; 
        declare continue HANDLER for not found set done = true;
        open cur;
        fetch cur into var_city,var_tablename;
        while (not done) do
                INSERT into t_seg_1 
        (ID,PROVINCE,PROVINCECODE,CITY,CITYCODE,COUNTY,COUNTYCODE,TOWN,TOWNCODE,KEYCODE,BIZCODE,KEYTYPE,MATCHTYPE,CREATEDATE,MODIFYDATE,ISSUCCESS)
     SELECT 
      ID,PROVINCE,PROVINCECODE,CITY,CITYCODE,COUNTY,COUNTYCODE,TOWN,TOWNCODE,KEYCODE,BIZCODE,KEYTYPE,MATCHTYPE,CREATEDATE,MODIFYDATE,ISSUCCESS
            FROM t_new_seg_hismatch
            WHERE city = '110000-1';    
           SET sql_sync= CONCAT("INSERT into ",var_tablename,"(ID,PROVINCE,PROVINCECODE,CITY,CITYCODE,COUNTY,COUNTYCODE,TOWN,TOWNCODE,KEYCODE,BIZCODE,KEYTYPE,MATCHTYPE,CREATEDATE,MODIFYDATE,ISSUCCESS)
        SELECT 
      ID,PROVINCE,PROVINCECODE,CITY,CITYCODE,COUNTY,COUNTYCODE,TOWN,TOWNCODE,KEYCODE,BIZCODE,KEYTYPE,MATCHTYPE,CREATEDATE,MODIFYDATE,ISSUCCESS
            FROM t_new_seg_hismatch
            WHERE CITYCODE = '",var_city,"';");
     select sql_sync;
          set @sql = sql_sync;
      prepare s1 from @sql;
      execute s1;
            FETCH cur into var_city,var_tablename;
        end WHILE;

        CLOSE cur;
    end;//
        
        call pro_sync_seg(); 
        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值