• mysql 游标(可循环读取一行数据插入到另一张表)


    一、需求

      1. 抽取表(test1,表没有自增主键,因为我是excel导入过来的)的数据,存储到另外一张表(test2)主键也是非自增。

      2. 游标其实重要的是读取一行数据,然后随意操作这一行数据。

    二、操作

      1. test1表,等下用mysql游标将要一行一行读取数据的表。

       

       2. test2表,数据读取后在存储过程里创建id值插入表里。

       

       

      3. 如果存储过程存在就删除,方便测试多次执行。

    DROP procedure IF EXISTS test_cursor;

      4. 代码示例

    CREATE PROCEDURE test_cursor()
            BEGIN
                DECLARE i int default 0;    
                DECLARE done INT DEFAULT 0;
                
                DECLARE name_ varchar(255) DEFAULT NULL; 
                DECLARE age_ int DEFAULT NULL; 
                DECLARE phone_ varchar(255) DEFAULT NULL; 
                DECLARE sort_ int DEFAULT NULL; 
                
                --  创建游标  
                declare cur cursor for 
                    select name, age, phone, sort from test1; -- 需要读取的数据列表
            
                --  游标中的内容执行完后将done设置为1
                 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
                 
                 -- 打开游标
                OPEN cur;
                
                --  执行循环  
                read_loop: LOOP 
                -- 提取游标里的数据 
                FETCH cur INTO name_, age_, phone_, sort_;
                
                -- 判断是否结束循环  
                IF done =1 THEN    
                    LEAVE read_loop;  
                END IF;
                
                set i = i + 1; -- 这里是整形主键自增(可以修改i的默认值),当然也可以换成函数uuid()
                
                insert into test2(id, name, age, phone, sort) VALUES (i, name_, age_, phone_, sort_);
                
                End LOOP;
                -- 关闭游标  
                close cur;  
                        
       END;
    View Code

      5. 执行存储过程

    call test_cursor();

      6. 看看test2表主键是int类型的结果

       

      7. 先把id修改成字符串类型,再换成uuid函数生成主键试试

       

    DROP procedure IF EXISTS test_cursor;
    
    CREATE PROCEDURE test_cursor()
            BEGIN
                -- DECLARE i int default 0;    
                DECLARE done INT DEFAULT 0;
                
                DECLARE name_ varchar(255) DEFAULT NULL; 
                DECLARE age_ int DEFAULT NULL; 
                DECLARE phone_ varchar(255) DEFAULT NULL; 
                DECLARE sort_ int DEFAULT NULL; 
                
                --  创建游标  
                declare cur cursor for 
                    select name, age, phone, sort from test1; -- 需要读取的数据列表
            
                --  游标中的内容执行完后将done设置为1
                 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
                 
                 -- 打开游标
                OPEN cur;
                
                --  执行循环  
                read_loop: LOOP 
                -- 提取游标里的数据 
                FETCH cur INTO name_, age_, phone_, sort_;
                
                -- 判断是否结束循环  
                IF done =1 THEN    
                    LEAVE read_loop;  
                END IF;
                
                -- set i = i + 1; -- 这里是整形主键自增,当然也可以换成函数uuid()
                
                insert into test2(id, name, age, phone, sort) VALUES (UUID(), name_, age_, phone_, sort_);
                
                End LOOP;
                -- 关闭游标  
                close cur;  
                        
       END;
    
    call test_cursor();
    View Code

      8. 再看看数据结果,测试这个是为了展示每一行读取后的操作随意性。

       

    自己动手测试一番的记录。

  • 相关阅读:
    数据结构之fhq-treap
    [AtCoder Regular Contest 096 E] Everything on It 解题报告 (第二类斯特林数+容斥原理)
    指纹识别人脸识别 iOS
    HTTP协议的8种请求类型介绍
    获取已安装app的bundle id
    iOS生成Bundle包及使用
    为什么说Objective-C是一门动态的语言?
    引用外部静态库(.a文件)时或打包.a时,Category方法无法调用。崩溃
    代码混淆 iOS
    HDU 1695 GCD(莫比乌斯反演)
  • 原文地址:https://www.cnblogs.com/TulipsWill/p/13047013.html
Copyright © 2020-2023  润新知