From 52d9b80649ad99af2cd659d731b07c692c7718fb Mon Sep 17 00:00:00 2001 From: "mori.k" Date: Tue, 20 May 2025 18:48:03 +0900 Subject: [PATCH] =?UTF-8?q?=E3=83=90=E3=83=83=E3=83=81=E3=82=B9=E3=83=86?= =?UTF-8?q?=E3=83=BC=E3=82=BF=E3=82=B9=E7=AE=A1=E7=90=86=E3=83=86=E3=83=BC?= =?UTF-8?q?=E3=83=96=E3=83=ABupsert=E3=82=B9=E3=83=88=E3=82=A2=E3=83=89=20?= =?UTF-8?q?=E9=80=94=E4=B8=AD=E3=82=B3=E3=83=9F=E3=83=83=E3=83=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../upsert_jskult_batch_status_manage.sql | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 rds_mysql/stored_procedure/internal07/upsert_jskult_batch_status_manage.sql 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 new file mode 100644 index 00000000..b7c04294 --- /dev/null +++ b/rds_mysql/stored_procedure/internal07/upsert_jskult_batch_status_manage.sql @@ -0,0 +1,93 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +-- $$から始まる文字は後から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; + +-- エラー処理 +DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + GET DIAGNOSTICS CONDITION 1 + @error_state = RETURNED_SQLSTATE, @error_msg = MESSAGE_TEXT; + ROLLBACK; + SET @error_msg = ( + CASE + WHEN LENGTH(@error_msg) > 128 THEN CONCAT(SUBSTRING(@error_msg, 1, 125), '...') + ELSE @error_msg + END + ); + SIGNAL SQLSTATE '45000' + SET MYSQL_ERRNO = @error_state, MESSAGE_TEXT = @error_msg; + END; + +SQL SECURITY INVOKER +BEGIN + +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, ?), + 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, ?), + upd_user = CURRENT_USER(), + upd_date = CURRENT_TIMESTAMP();'; + +OPEN table_cursor; + +-- ループ +TableCursorLoop: LOOP + -- スキーマ取得 + FETCH table_cursor INTO temp_table_id, target_column_value; + + -- 終了条件ループ抜き + IF fetch_done THEN + LEAVE TableCursorLoop; + END IF; + + 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); + + -- 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; + DEALLOCATE PREPARE stmt; + +END LOOP; +CLOSE table_cursor; +COMMIT; + +END \ No newline at end of file