内容の修正とコメントを記載

This commit is contained in:
mori.k 2025-05-21 14:01:54 +09:00
parent 52d9b80649
commit fce17870ce

View File

@ -2,20 +2,7 @@
-- $$から始まる文字は後からREPLACEする文字を示す独自ルール
-- 当プロシージャは、同一セッション内での並列処理を実行することができない
-- 実行者の権限でストアドプロシージャを実行するために、「SQL SECURITY INVOKER」を付与している
CREATE PROCEDURE `internal07`.`upsert_jskult_batch_status_manage`(IN process_name varchar(100), IN process_type varchar(50), IN process_status varchar(50), IN total_run_count INT, max_run_count_flg TINYINT(1))
-- 振り分けスキーマ
DECLARE distribution_schema VARCHAR(20);
-- 振り分けカラム
DECLARE target_column_value VARCHAR(100);
-- 振り分け先テーブルID
DECLARE temp_table_id VARCHAR(18);
-- カーソルフェッチステータス
DECLARE fetch_done BOOLEAN DEFAULT FALSE;
-- カーソル設定
DECLARE table_cursor CURSOR FOR SELECT Id FROM internal07.;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET fetch_done = TRUE;
CREATE PROCEDURE `internal07`.`upsert_jskult_batch_status_manage`(process_name varchar(100), process_type varchar(50), process_status varchar(50), total_run_count INT, max_run_count_flg TINYINT(1))
-- エラー処理
DECLARE EXIT HANDLER FOR SQLEXCEPTION
@ -40,54 +27,87 @@ START TRANSACTION;
-- UPSERT STATEMENT設定
SET @upsert_statement_base =
'INSERT INTO $$distribution_schema$$.jskult_archive_manager
(process_name, process_date, process_type, process_status,
total_run_count, max_run_count_flg, ins_user, ins_date, upd_user, upd_date)
SELECT
?, ?, ?, ?, total_run_count = IF(? IS NULL, total_run_count, ?),
max_run_count_flg = IF(? IS NULL, total_run_count, ?),
'INSERT INTO src07.jskult_batch_status_manage
(process_name, process_date, process_type, process_status, total_run_count,max_run_count_flg,
ins_user, ins_date, upd_user, upd_date)
VALUES(
(?, ?, ?, ?, ?, ?,
ins_user, ins_date, upd_user, upd_date)
FROM
internal07.jskult_archive_manager AS internaltb
WHERE
internaltb.process_name = ? AND
internaltb.process_date = ?
ON DUPLICATE KEY UPDATE
process_type = IF(? IS NULL, process_type, ?),
process_status = IF(? IS NULL, process_status, ?),
total_run_count = IF(? IS NULL, total_run_count, ?),
max_run_count_flg = IF(? IS NULL, max_run_count_flg, ?),
process_type = ?,
process_status = ?,
total_run_count = ?,
max_run_count_flg = ?,
upd_user = CURRENT_USER(),
upd_date = CURRENT_TIMESTAMP();';
OPEN table_cursor;
-- ループ
TableCursorLoop: LOOP
-- スキーマ取得
FETCH table_cursor INTO temp_table_id, target_column_value;
-- 日付テーブルから処理年月日を取得
SET @select_process_date_statement = 'SELECT syor_date INTO get_value FROM src07.hdke_tbl';
-- 終了条件ループ抜き
IF fetch_done THEN
LEAVE TableCursorLoop;
END IF;
PREPARE stmt FROM @select_process_date_statement;
EXECUTE stmt:
DEALLOCATE PREPARE stmt;
SET @insert_process_date = get_value;
SET @distribution_schema = internal07.get_distribution_to_schema('jskult_archive_manager', 'process_name', target_column_value);
SET @temp_table_id = temp_table_id;
SET @upsert_statement = REPLACE(@upsert_statement_base, "$$distribution_schema$$", @distribution_schema);
-- INSERT時に引数がNULLである時用の変換
SET @total_run_count = IFNULL(total_run_count, 0);
SET @max_run_count_flg = IFNULL(max_run_count_flg, 0);
-- INSERT時に引数がNULLであるとき0を設定
SET @insert_total_run_count = IFNULL(total_run_count, 0);
SET @insert_max_run_count_flg = IFNULL(max_run_count_flg, 0);
-- UPSERT実行
PREPARE stmt FROM @upsert_statement;
EXECUTE stmt USING @temp_table_id, @process_name, @process_type, @process_status, @total_run_count, @max_run_count_flg;
-- 元々の値を取得するためのステートメント
SET @select_statement_base = 'SELECT $$select_column$$ INTO get_value FROM src07.jskult_batch_status_manage WHERE process_name = ?'
-- UPDATE時にprocess_typeがNULLであるとき更新前の値を設定
IF process_type = NULL
SET @select_statement = REPLACE(@select_statement_base, "$$select_column$$", "process_type");
PREPARE stmt FROM @select_statement;
EXECUTE stmt USING @process_name;
DEALLOCATE PREPARE stmt;
SET @update_process_type = get_value;
ELSE
SET @update_process_type = process_type;
END IF;
-- UPDATE時にprocess_statusがNULLであるとき更新前の値を設定
IF process_status = NULL
SET @select_statement = REPLACE(@select_statement_base, "$$select_column$$", "process_status");
PREPARE stmt FROM @select_statement;
EXECUTE stmt USING @process_name;
DEALLOCATE PREPARE stmt;
SET @update_process_status = get_value;
ELSE
SET @update_process_status = process_status;
END IF;
-- UPDATE時にtotal_run_countがNULLであるとき更新前の値を設定
IF total_run_count = NULL
SET @select_statement = REPLACE(@select_statement_base, "$$select_column$$","total_run_count");
PREPARE stmt FROM @select_statement;
EXECUTE stmt USING @process_name;
DEALLOCATE PREPARE stmt;
SET @update_total_run_count = get_value
ELSE
SET @update_total_run_count = total_run_count;
END IF;
-- UPDATE時にmax_run_count_flgがNULLであるとき更新前の値を設定
IF max_run_count_flg = NULL
SET @select_statement = REPLACE(@select_statement_base, "$$select_column$$","max_run_count_flg");
PREPARE stmt FROM @select_statement;
EXECUTE stmt USING @process_name;
DEALLOCATE PREPARE stmt;
SET @update_max_run_count_flg = get_value;
ELSE
SET @update_max_run_count_flg = max_run_count_flg;
END IF;
-- UPSERT実行
PREPARE stmt FROM @upsert_statement;
EXECUTE stmt USING @process_name, @insert_process_date , @process_type, @process_status, @insert_total_run_count, @insert_max_run_count_flg, @update_process_type, @update_process_status, @update_total_run_count, @update_max_run_count_flg;
DEALLOCATE PREPARE stmt;
END LOOP;
CLOSE table_cursor;
COMMIT;
END