MySQLのストアドルーチンを試す

INSERTを複数回行いたくて調べていたらストアドルーチンという単語にたどり着いた。

開発環境

github.com

# ホスト
> docker --version
Docker version 20.10.8, build 3967b7d

> docker-compose --version
docker-compose version 1.29.2, build 5becea4c

# コンテナ
root@{CONTAINER_ID}:/# mysql --version
mysql  Ver 8.0.28 for Linux on x86_64 (MySQL Community Server - GPL)

ストアドルーチンとは

データベースに対する一連の命令を1つにまとめたもの。 ストアドルーチンには2つの種類があり、戻り値が無いものをストアドプロシージャ、戻り値が有るものをストアドファンクションと言う。

前準備

# テーブル作成
CREATE TABLE t0(
    age INT NOT NULL,
    height INT NOT NULL
)
;

ストアドプロシージャ

コード

DELIMITER //

CREATE PROCEDURE iota_insert(IN i INT)
BEGIN
    DECLARE count INT DEFAULT 0;
    WHILE count < i DO
        SET count = count + 1;
        INSERT INTO t0 VALUES(count, count);
    END WHILE;
END
//

DELIMITER ;

呼び出し

mysql> call iota_insert(10000);
Query OK, 1 row affected (19.33 sec)

中身確認

mysql> SELECT * FROM t0 LIMIT 5;
+-----+--------+
| age | height |
+-----+--------+
|   1 |      1 |
|   2 |      2 |
|   3 |      3 |
|   4 |      4 |
|   5 |      5 |
+-----+--------+

mysql> SELECT COUNT(age), COUNT(height) FROM t0;
+------------+---------------+
| COUNT(age) | COUNT(height) |
+------------+---------------+
|      10000 |         10000 |
+------------+---------------+

ストアドファンクション

コード

DELIMITER //

CREATE FUNCTION hello(s CHAR(10)) RETURNS CHAR(100) DETERMINISTIC
BEGIN
    RETURN CONCAT('Hello', s, '.');
END
//

DELIMITER ;

呼び出し

mysql> SELECT hello('TOM');
+--------------+
| hello('TOM') |
+--------------+
| HelloTOM.    |
+--------------+

mysql> SELECT hello(name) FROM idol LIMIT 3;
+------------------------+
| hello(name)            |
+------------------------+
| Hello櫻木 真乃.        |
| Hello八宮 めぐる.      |
| Hello風野 灯織.        |
+------------------------+

参考