今日、上司から、ストアドプロシージャを使用してテストデータを作成するように依頼されました。その後、私は、SQLプログラミングの魅力を初めて発見したときに、ストアドプロシージャを使用してテストデータを作成できるようになりました。以下に、テストデータの作成プロセスについて説明します。
1. 2つのテーブル(ユーザーテーブルと部門テーブル)を準備します
二、基本的な知識を準備する
一時変数、ローカル変数、カーソル、ループ、ネストされたループなどが使用されます。最後に記載した参考資料をご参照ください。
3.部門テーブルデータを準備します
第四に、ストレージエンジンは次のように書かれています
DELIMITER //
CREATE PROCEDURE mockDataCreate(IN dataCount INT) -- dataCount各个部门人数
BEGIN
DECLARE _deptno INT; -- 部门ID
DECLARE done INT; -- 完成标记
DECLARE initCount INT; -- 初始标记
DECLARE dept_cursor CURSOR FOR SELECT id FROM dept; -- 定义游标
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; -- 定义记录结束后游标触发操作
SET done = 0;
SET initCount = 1;
OPEN dept_cursor; -- 打开游标
dept_cursor_loop:LOOP -- 定义循环
FETCH dept_cursor INTO _deptno; -- 使用游标获取数据到指定局部变量
IF done = 1 THEN -- 游标走到末尾,done会自动被设置为1,此时会执行此句
LEAVE dept_cursor_loop; -- 跳出循环
END IF;
data_count_loop:LOOP -- 每个部门插入人数循环
IF initCount > dataCount THEN
LEAVE data_count_loop;
END IF;
INSERT INTO user(name, deptno) VALUES(CONCAT('用户', initCount), _deptno);
SET initCount = initCount + 1;
END LOOP;
SET initCount = 1;
END LOOP;
END //
DELIMITER ;
6Wのデータを挿入すると、実行に約100Sかかり、非常に時間がかかりました。毎回SQLの解析と1回の挿入が原因かどうかはわかりません。
とても香りがよいですか?ハハ、データを挿入するためにJavaコードを書く必要はなくなり、関連データを作成することもできます。
そして、実行前は常にストアドプロシージャの実行が心配でしたが、終了条件が設定されておらず、常にデータが作成されている場合はどうすればよいのでしょうか。
show procedure status; -- 查询所有存储过程状态
show create procedure proc_name; -- 查询存储过程创建
show create function func_name; -- 查询函数创建
SHOW PROCESSLIST; -- 查询当前运行的MYSQL线程
KILL 线程ID; -- 终止ID为此ID的MYSQL线程
DROP PROCEDURE [ IF EXISTS ] <过程名> -- 删除存储过程
参考文献:
MySQLストアドプロシージャループのネストを使用するための手順