mysql 利用动态sql 游标 ,动态去除数据中空格 -----------------存储过程

哎 !  有先数据是手动插入的,爬虫爬取来的数据中亦可能存在异常数据

这个文章,利用存储过程,用来遍历表字段, 然后利用trim函数去除数据中的空格

目录

知识储备:

1. mysql 查询表字段信息

2 .存储过程----》循环

 3 . 存储过程----》游标

4. 去空格方法

5.综合一下需要替换的是表名库名字


知识储备:

1. mysql 查询表字段信息

SELECT
  COLUMN_NAME "字段名称",
  COLUMN_TYPE "字段类型长度",
  IF(EXTRA="auto_increment",CONCAT(COLUMN_KEY,"(", IF(EXTRA="auto_increment","自增长",EXTRA),")"),COLUMN_KEY) "主外键",
  IS_NULLABLE "空标识",
  COLUMN_COMMENT "字段说明"
FROM
    information_schema. COLUMNS
-- 数据库名:jn_power 表名 rpt_cap_hour_ammeter_201810
WHERE TABLE_SCHEMA = 'jn_power' AND TABLE_NAME = 'rpt_cap_hour_ammeter_201810';

2 .存储过程----》循环

介绍 LOOP 循环吧、这里要用到,,,其他还有俩种,,自行补充学习吧

DROP PROCEDURE IF EXISTS `pro13`;
DELIMITER $$
CREATE PROCEDURE `pro13`()
BEGIN
    -- 定义变量
    DECLARE v_i int unsigned DEFAULT 0;
    LOOP_LABEL:LOOP  -- 定义Loop循环 名字,开始,像不像go to用法,,哈哈哈
        IF v_i = 3 THEN
            SET v_i = v_i+1;
            ITERATE LOOP_LABEL; -- 中断继续就是contiue 意思
        END IF;
        SELECT v_i;
        SET v_i = v_i+1;
        IF v_i >= 5 THEN
            LEAVE LOOP_LABEL; -- break 的意思
        END IF;
    END LOOP;  -- 结束循环
END $$
DELIMITER ;

CALL pro13();

 3 . 存储过程----》游标

DELIMITER $$

USE `chy2019` $$

DROP PROCEDURE IF EXISTS `copy_order_data` $$

CREATE DEFINER = `root` @`%` PROCEDURE `copy_order_data` (IN p_source VARCHAR (100)) 
BEGIN
  -- 需要定义接收游标数据的变量 
  DECLARE done BOOLEAN DEFAULT 0 ;
  -- 自定义变量
  DECLARE var_price DOUBLE DEFAULT NULL ;
  DECLARE var_pay_time TIMESTAMP DEFAULT NULL ;
  DECLARE var_product VARCHAR (100) DEFAULT NULL ;
  DECLARE var_source VARCHAR (100) DEFAULT NULL ;
  -- 声明游标    重要看这里 定义游标这里sql不是动态的,,
  DECLARE cur CURSOR FOR 
  -- 作用于哪个语句
  SELECT 
    price,
    pay_time,
    product,
    source 
  FROM
    cms_aw_order 
  WHERE source = p_source ;
  -- 设置结束标志
  -- 这条语句定义了一个 CONTINUE HANDLER,它是在条件出现时被执行的代码。这里,它指出当 SQLSTATE '02000'出现时,SET done=1 。SQLSTATE '02000'是一个未找到条件,当REPEAT由于没有更多的行供循环而不能继续时,出现这个条件  
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1 ;
  -- 打开游标
  OPEN cur ;
  -- 使用repeat循环语法
  REPEAT
    -- 批读取数据到指定变量上
    FETCH cur INTO var_price, 
    var_pay_time,
    var_product,
    var_source ;
    -- 进行逻辑操作
    INSERT INTO cms_aw_order_copy (price, pay_time, product, source) 
    VALUES
      (
        var_price,
        var_pay_time,
        var_product,
        var_source
      ) ;
    -- 循环结束条件
    UNTIL done 
  END REPEAT ;
  -- 关闭游标
  CLOSE cur ;
END $$

DELIMITER ;

4. 去空格方法

  • trim()去除左右空格

  • l trim()去除左空

  • rtrim() 去除有空

5.综合一下需要替换的是表名库名字

begin 
declare var_name varchar(1024) default '';
DECLARE done int default 0;
DECLARE from_name VARCHAR(50);
DECLARE db_name VARCHAR(50);
DECLARE sql_appendix VARCHAR(500);
DECLARE sql_trim VARCHAR(500);
declare SQL_FOR_SELECT varchar(500);   -- 定义预处理sql语句


-- ---------------------------------------------------------------
DECLARE cur CURSOR FOR 
SELECT column_name FROM information_schema.COLUMNS WHERE table_name = 'check_itme' AND table_schema = 'test2';
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' set done= 1; 
open cur;
posLoop:LOOP
FETCH cur INTO var_name;
IF done = 1 THEN
	LEAVE posLoop ;
END IF ; 
SELECT var_name;
set SQL_FOR_SELECT = CONCAT("UPDATE check_itme set ",var_name,"=","trim(",var_name,")");   -- 拼接查询sql语句
set @sql = SQL_FOR_SELECT;
PREPARE stmt FROM @sql;         -- 预处理动态sql语句
EXECUTE stmt ;                  -- 执行sql语句
deallocate prepare stmt;      -- 释放prepare
END LOOP posLoop ; 
CLOSE cur ;  
end

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值