From fce17870ce238cac3de1c919a05de25d6be022ab Mon Sep 17 00:00:00 2001 From: "mori.k" Date: Wed, 21 May 2025 14:01:54 +0900 Subject: [PATCH] =?UTF-8?q?=E5=86=85=E5=AE=B9=E3=81=AE=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E3=81=A8=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88=E3=82=92=E8=A8=98?= =?UTF-8?q?=E8=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../upsert_jskult_batch_status_manage.sql | 120 ++++++++++-------- 1 file changed, 70 insertions(+), 50 deletions(-) diff --git a/rds_mysql/stored_procedure/internal07/upsert_jskult_batch_status_manage.sql b/rds_mysql/stored_procedure/internal07/upsert_jskult_batch_status_manage.sql index b7c04294..5384fa86 100644 --- a/rds_mysql/stored_procedure/internal07/upsert_jskult_batch_status_manage.sql +++ b/rds_mysql/stored_procedure/internal07/upsert_jskult_batch_status_manage.sql @@ -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 \ No newline at end of file