编写存储过程批量造数据

介绍

在实际工作中没有测试性能,我们经常需要改造大批量的数据,手动插入是不太可能的,这时候就得用到存储过程了

CREATE TABLE `kf_user_info` (
  `id` int(11) NOT NULL COMMENT '用户id',
  `gid` int(11) NOT NULL COMMENT '客服组id',
  `name` varchar(25) NOT NULL COMMENT '客服名字',
  `nickName` varchar(64) NOT NULL COMMENT '客服昵称',
  `mobile` varchar(12) NOT NULL COMMENT '手机号',
  `maxChannel` int(11) NOT NULL COMMENT '最大接入数',
  `createTime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updateTime` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `mobile` (`mobile`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='客户信息表';

如何定义一个存储过程呢?

CREATE PROCEDURE 存储过程名称 ([参数列表])
BEGIN
    需要执行的语句
END    

举个例子,插入id为100-999的1000条数据
用Navicat执行

-- 删除之前定义的
DROP PROCEDURE IF EXISTS create_kf;

-- 开始定义
CREATE PROCEDURE create_kf(IN loop_times INT) 
BEGIN
	DECLARE var INT;
	SET var = 100;
	WHILE var < loop_times DO    
		INSERT INTO kf_user_info (`id`,`gid`,`name`,`nickName`,`mobile`,`maxChannel`) 
		VALUES (var, 1000, var, var, var, var);
		SET var = var + 1;
	END WHILE; 
END;

-- 调用
call create_kf(1000);

存储过程的三种参数类型

参数类型是否返回作用
IN向存储过程传入参数,存储过程中修改该参数的值,不能被返回
OUT把存储过程计算的结果放到该参数中,调用者可以得到返回值
INOUTIN和OUT的结合,即用于存储过程的传入参数,同时又可以把计算结构放到参数中,调用者可以得到返回值

用MySQL执行

得用DELIMITER 定义新的结束符,因为默认情况下SQL采用(;)作为结束符,这样当存储过程中的每一句SQL结束之后,采用(;)作为结束符,就相当于告诉MySQL可以执行这一句了。但是存储过程是一个整体,我们不希望SQL逐条执行,而是采用存储过程整段执行的方式,因此我们就需要定义新的DELIMITER ,新的结束符可以用(//)或者($$)

因为上面的代码应该就改为如下这种方式

DELIMITER //
CREATE PROCEDURE create_kf_kfGroup(IN loop_times INT)  
BEGIN  
	DECLARE var INT;
	SET var = 100;
	WHILE var <= loop_times DO    
		INSERT INTO kf_user_info (`id`,`gid`,`name`,`nickName`,`mobile`,`maxChannel`) 
		VALUES (var, 1000, var, var, var, var);
		SET var = var + 1;
	END WHILE;  
END //
DELIMITER ; 

查询已经定义的存储过程

show procedure status;

参考博客

在Oracle数据库中,编写存储过程以使用MERGE语句批量更新大量数据是一种常见的做法。MERGE语句可以根据条件来决定是插入新记录还是更新现有记录,这在处理大量数据时特别有效,因为它可以减少数据操作的次数和提高性能。 以下是使用MERGE语句编写存储过程的基本步骤: 1. 定义存储过程,包括输入参数和要操作的数据表。 2. 在存储过程内部编写MERGE语句,其中包括: - 一个ON子句,用于指定哪些条件下的记录需要被匹配。 - 当匹配到记录时,一个THEN UPDATE子句用于定义如何更新这些记录。 - 如果没有匹配到记录,一个THEN INSERT子句用于定义如何插入新记录。 3. 使用存储过程的输入参数来动态构建或执行MERGE语句。 下面是一个简单的存储过程示例,该过程使用MERGE语句来批量更新数据: ```sql CREATE OR REPLACE PROCEDURE UpdateOrInsertData( p_source_table IN VARCHAR2, p_key_column IN VARCHAR2, p_value_column IN VARCHAR2, p_update_column IN VARCHAR2, p_new_value IN VARCHAR2 ) AS BEGIN MERGE INTO target_table t USING (SELECT * FROM TABLENAME WHERE ROWNUM <= 1000) s ON (t.key_column = s.key_column) WHEN MATCHED THEN UPDATE SET t.update_column = s.new_value WHEN NOT MATCHED THEN INSERT (t.key_column, t.update_column) VALUES (s.key_column, s.new_value); COMMIT; END UpdateOrInsertData; ``` 在这个例子中,`target_table`是目标表,`TABLENAME`是一个包含数据的表或视图,`key_column`是用来匹配记录的关键列,`update_column`是需要更新的列,`new_value`是更新后的新值。存储过程接收这些参数来执行更新或插入操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java识堂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值