首页 > 数据库 >在MySQL 5.7中使用DECLARE语句的注意事项

在MySQL 5.7中使用DECLARE语句的注意事项

时间:2023-09-17 16:02:18浏览次数:35  
标签:BEGIN temp 5.7 INT DECLARE DEFAULT MySQL id

在MySQL执行以下SQL报错

DELIMITER //
CREATE PROCEDURE generate_and_insert_data()
BEGIN
    DECLARE i INT DEFAULT 1;
    DECLARE j INT DEFAULT 1;
    DECLARE total_iterations INT DEFAULT 1000;
    WHILE i <= total_iterations DO
        -- 创建临时表用于存储生成的id和apply_no
        CREATE TEMPORARY TABLE temp_data (
            temp_id INT,
            temp_apply_no VARCHAR(50)
        );
        -- 生成100个不重复的id和apply_no
        WHILE j <= 100 DO
            -- 生成随机的id和apply_no
            DECLARE temp_id INT;
            DECLARE temp_apply_no VARCHAR(50);
            SET temp_id = FLOOR(RAND() * 1000000) + 1;
            SET temp_apply_no = CONCAT('APPLY_', temp_id);
            -- 检查生成的id和apply_no是否已存在
            WHILE EXISTS (SELECT * FROM temp_data WHERE temp_id = temp_id OR temp_apply_no = temp_apply_no) DO
                SET temp_id = FLOOR(RAND() * 1000000) + 1;
                SET temp_apply_no = CONCAT('APPLY_', temp_id);
            END WHILE;
            -- 将生成的id和apply_no插入到临时表中
            INSERT INTO temp_data (temp_id, temp_apply_no) VALUES (temp_id, temp_apply_no);
            SET j = j + 1;
        END WHILE;
        -- 将临时表中的数据插入到user_base表中
        INSERT INTO acc_loan.user_base (id, apply_no, project_no, phone, id_no, id_type, batch_date, car_no, created_date, due_bill_no, hash_key, last_modified_date, remark, sex, user_id, user_name, version)
        SELECT temp_id, temp_apply_no, 'WS10043190001', '15625172814', '511423199309110012', 'IDENTITY', CURDATE(), CONCAT('CAR_', temp_id), NOW(), temp_apply_no, MD5(CONCAT('IDNO_', temp_id)), NOW(), CONCAT('REMARK_', temp_id), IF(RAND() > 0.5, 'MALE', 'FEMALE'), CONCAT('USER_', temp_id), CONCAT('USER_NAME_', temp_id), NULL
        FROM temp_data;
        -- 删除临时表
        DROP TEMPORARY TABLE IF EXISTS temp_data;
        SET i = i + 1;
        SET j = 1;
    END WHILE;
END //
DELIMITER ;

错误信息如下:

> 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE temp_id INT;
              DECLARE temp_apply_no VARCHAR(50);
            ' at line 15

图片.png

改正方法:

在MySQL 5.7中,DECLARE语句必须在BEGIN...END块之前进行声明。报错信息指出在DECLARE temp_id INT;语句附近存在语法错误。

为了解决这个问题,可以将DECLARE语句移动到BEGIN语句之前。

DELIMITER //
CREATE PROCEDURE generate_and_insert_data()
BEGIN
    DECLARE i INT DEFAULT 1;
    DECLARE j INT DEFAULT 1;
    DECLARE total_iterations INT DEFAULT 1000;
    DECLARE temp_id INT; -- 将DECLARE语句移动到BEGIN之前
    DECLARE temp_apply_no VARCHAR(50); -- 将DECLARE语句移动到BEGIN之前
    WHILE i <= total_iterations DO
        -- 创建临时表用于存储生成的id和apply_no
        CREATE TEMPORARY TABLE temp_data (
            temp_id INT,
            temp_apply_no VARCHAR(50)
        );
        -- 生成100个不重复的id和apply_no
        WHILE j <= 100 DO
            -- 生成随机的id和apply_no
            SET temp_id = FLOOR(RAND() * 1000000) + 1;
            SET temp_apply_no = CONCAT('APPLY_', temp_id);
            -- 检查生成的id和apply_no是否已存在
            WHILE EXISTS (SELECT * FROM temp_data WHERE temp_id = temp_id OR temp_apply_no = temp_apply_no) DO
                SET temp_id = FLOOR(RAND() * 1000000) + 1;
                SET temp_apply_no = CONCAT('APPLY_', temp_id);
            END WHILE;
            -- 将生成的id和apply_no插入到临时表中
            INSERT INTO temp_data (temp_id, temp_apply_no) VALUES (temp_id, temp_apply_no);
            SET j = j + 1;
        END WHILE;
        -- 将临时表中的数据插入到user_base表中
        INSERT INTO acc_loan.user_base (id, apply_no, project_no, phone, id_no, id_type, batch_date, car_no, created_date, due_bill_no, hash_key, last_modified_date, remark, sex, user_id, user_name, version)
        SELECT temp_id, temp_apply_no, 'WS10043190001', '15625172814', '511423199309110012', 'IDENTITY', CURDATE(), CONCAT('CAR_', temp_id), NOW(), temp_apply_no, MD5(CONCAT('IDNO_', temp_id)), NOW(), CONCAT('REMARK_', temp_id), IF(RAND() > 0.5, 'MALE', 'FEMALE'), CONCAT('USER_', temp_id), CONCAT('USER_NAME_', temp_id), NULL
        FROM temp_data;
        -- 删除临时表
        DROP TEMPORARY TABLE IF EXISTS temp_data;
        SET i = i + 1;
        SET j = 1;
    END WHILE;
END //
DELIMITER ;

修改后执行成功: 图片.png

标签:BEGIN,temp,5.7,INT,DECLARE,DEFAULT,MySQL,id
From: https://blog.51cto.com/u_13372349/7502425

相关文章

  • Linux平台卸载MySQL总结
     如何在Linux下卸载MySQL数据库呢?下面总结、整理了一下Linux平台下卸载MySQL的方法。MySQL的安装主要有三种方式:二进制包安装(UsingGenericBinaries)、RPM包安装、源码安装。对应不同的安装方式,卸载的步骤有些不同。文章中如有不足或不对的地方,敬请指出或补充! RPM包安装方......
  • 如何修改MySQL数据库名称
    需求比如数据库名称old_db想改名为new_dbMySQL修改数据库名称比较麻烦,不支持直接修改,需要通过其它方式间接达到修改数据库名称的目的。在MySQL5.1.23之前的旧版本中,我们可以使用RENAMEDATABASE来重命名数据库,但此后版本,因为安全考虑,删掉了这一命令。先导出数据,再导入数......
  • MySQL的安装
    首先下载mysql    安装到D盘,然后全部解压。然后在该文件夹里面添加data文件和my.ini文本如下  在my.ini文本里面添加该代码,如下(注意当下路径为你的安装路径,且不能出现中文) 上面的步骤完成后,便右击此电脑,进入属性,进入高级系统设置,进入环境变量。然后创建MySQL_......
  • MySQL 总结
    MySQL笔记MySQL视频课程......
  • mysql innodb_lock_wait_timeout修改
    一、概述设置mysql事务锁超时时间innodb_lock_wait_timeoutMysql数据库采用InnoDB模式,默认参数:innodb_lock_wait_timeout设置锁等待的时间是50s,一旦数据库锁超过这个时间就会报错。二、修改1、查询SHOWVARIABLESLIKE'innodb_lock_wait_timeout';2、session级别修改SETi......
  • 三、(2)mysql介绍
    MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,目前属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,关系数据库管理系统)应用软件之一。关系数据库将数据保存在不同的表中......
  • 三、(3)Mysql数据库的安装
    关闭防火墙和selinux1、编译安装mysql5.71、清理安装环境:#yumerasemariadbmariadb-servermariadb-libsmariadb-devel-y#userdel-rmysql#rm-rf/etc/my*#rm-rf/var/lib/mysql2、创建mysql用户[root@mysql-server~]#useradd-rmysql-M-s/bin/false#-M-s/b......
  • mysql update、delete left join 操作
    1delete删除多表DELETEq,pqfromcom_purchasequoteqLEFTJOINcom_purchasequote_snapshootpqonq.id=pq.idwhereq.id=84110;删除一张表DELETEqfromcom_purchasequoteqLEFTJOINcom_purchasequote_snapshootpqonq.id=pq.idwhereq.id=82347;DELETEpqfrom......
  • 6-MySQL查询条件
    在MySQL中,高级查询是指使用更复杂的查询语句和操作符来检索和操作数据库中的数据。高级查询可以帮助您更精确地找到所需的信息,并提高查询的效率和灵活性。以下是高级查询的一些常见应用场景和意义:连接多个表:使用JOIN操作符将多个表连接起来,以便在一次查询中获取相关联的数据。这......
  • MySQL中的一些特殊函数
    FIELDFIELD(s,s1,s2...)SELECTFIELD("c","a","b","c","d","e");--返回字符串c在列表值中的位置,索引位置从1开始,没有返回0FIND_IN_SETFIND_IN_SET(s1,s2)SELECTFIND_IN_SET("c","a,b,c,d,e");......