功能需求描述:
系统房屋管理页面要求输入某栋房的楼层和每层的层数,快速添加房屋信息,以方便用户添加房屋信息。如下图所示
存储过程如下
DROP PROCEDURE IF EXISTS proc_create_building;
DELIMITER $
CREATE PROCEDURE proc_create_building(v_room CHAR(10),v_floor CHAR(10),v_unit CHAR(20),v_build_id INT,v_area_id INT,v_office_id CHAR(64))
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE j INT DEFAULT 1;
WHILE i<= CONVERT(v_floor,UNSIGNED) DO
WHILE j<= CONVERT(v_room,UNSIGNED) DO
INSERT INTO room_info(office_id,areaID,buildID,unit,floor,roomNumber,del_flag)
VALUES (
v_office_id,
v_area_id,
v_build_id,
v_unit,
CONCAT(i),
CONCAT(j),
'0'
);
SET j = j+1;
END WHILE;
SET j = 1;
SET i = i+1;
END WHILE;
END $
使用mysql数据库,输入6个参数。DELIMITER $ 的意思是结束符设置为$,也可以设置为其它,如多个分号。传入参数v_floor和v_room,因代码中的bean申明为String类型,实际数据库中存放的都是数字,又需要根据它们循环,故需要使用 CONVERT(v_floor,UNSIGNED) 转换为数字类型。
需要注意的是,循环嵌套,内层循环执行完后,必须将内层循环的条件变量重置为初始值(代码块中的SET j = 1;),外层循环才会循环执行。mysql存储过程中的字符变量不能申明为varchar,只能使用char(xx),这点与Oracle不同。尝试使用varchar都报错,存储过程创建失败。
数据库调用语句如下:
CALL proc_create_building('30', '20', 'A', 100, 1, '1') ;
mybaties的xml文件调用代码:
<!-- 自动创建房间信息 -->
<insert id="autoCreateRoom" statementType="CALLABLE">
CALL proc_create_building(
#{roomNumber,jdbcType=VARCHAR,mode=IN},
#{floor,jdbcType=VARCHAR,mode=IN},
#{unit,jdbcType=VARCHAR,mode=IN},
#{buildID,jdbcType=INTEGER,mode=IN},
#{areaID,jdbcType=INTEGER,mode=IN},
#{officeId,jdbcType=VARCHAR,mode=IN}
)
</insert>
因为存储过程执行的insert语句,故节点选用insert。
java代码就不贴出来了,功能到此完成。
做数据库优化的时候,定会碰到数据量比较大的表,下面是一个插入数据的存储过程
DROP PROCEDURE IF EXISTS proc_initData;
DELIMITER $
CREATE PROCEDURE proc_initData()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i<=2000000 DO
INSERT INTO dayFreeze(DevEUI,DeviceID,Reading,myStatus,myTime,sysTime)
VALUES('AABBCCDDEEFF0123','1000001234567891','1','2',SYSDATE(),SYSDATE());
SET i = i+1;
END WHILE;
END $
CALL proc_initData();