MySQL 存储过程是一组预先编译好的 SQL 语句,存储在数据库中,可以通过调用执行。存储过程可以接受参数,返回结果集,并且可以在数据库内部执行复杂的逻辑操作。
MySQL 存储过程主要分为两类:
原因:
解决方法:
假设有一个存储过程用于批量插入数据:
DELIMITER //
CREATE PROCEDURE BatchInsert(IN tableName VARCHAR(255), IN data JSON)
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE rowCount INT;
DECLARE value JSON;
SET rowCount = JSON_LENGTH(data);
WHILE i < rowCount DO
SET value = JSON_EXTRACT(data, CONCAT('$[', i, ']'));
SET @sql = CONCAT('INSERT INTO ', tableName, ' VALUES (', value, ')');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET i = i + 1;
END WHILE;
END //
DELIMITER ;优化建议:
DELIMITER //
CREATE PROCEDURE BatchInsertOptimized(IN tableName VARCHAR(255), IN data JSON)
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE rowCount INT;
DECLARE value JSON;
DECLARE columns VARCHAR(255);
DECLARE placeholders VARCHAR(1000);
DECLARE values VARCHAR(1000);
SET rowCount = JSON_LENGTH(data);
SET columns = 'column1, column2, column3'; -- 根据实际情况修改列名
SET placeholders = '?, ?, ?'; -- 根据实际情况修改占位符数量
WHILE i < rowCount DO
SET value = JSON_EXTRACT(data, CONCAT('$[', i, ']'));
SET values = CONCAT(values, '(', value, '), ');
SET i = i + 1;
END WHILE;
SET values = SUBSTRING(values, 1, LENGTH(values) - 2); -- 去掉最后一个逗号和空格
SET @sql = CONCAT('INSERT INTO ', tableName, ' (', columns, ') VALUES ', values);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END //
DELIMITER ;企业创新在线学堂
云+社区沙龙online[新技术实践]
腾讯云湖存储专题直播
腾讯云消息队列数据接入平台(DIP)系列直播
企业创新在线学堂
云+社区沙龙online [国产数据库]
云+社区沙龙online [国产数据库]
“中小企业”在线学堂
云+社区技术沙龙[第17期]
云+社区沙龙online [新技术实践]
第五届Techo TVP开发者峰会
第五届Techo TVP开发者峰会