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 d67be48e..545cc64f 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,112 +2,69 @@ -- $$から始まる文字は後からREPLACEする文字を示す独自ルール -- 当プロシージャは、同一セッション内での並列処理を実行することができない -- 実行者の権限でストアドプロシージャを実行するために、「SQL SECURITY INVOKER」を付与している -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)) +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) +) +SQL SECURITY INVOKER +BEGIN -- エラー処理 DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN - GET DIAGNOSTICS CONDITION 1 - @error_state = RETURNED_SQLSTATE, @error_msg = MESSAGE_TEXT; - ROLLBACK; + 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 + SIGNAL SQLSTATE '45000' + SET MYSQL_ERRNO = @error_state, MESSAGE_TEXT = @error_msg; + END; START TRANSACTION; -- UPSERT STATEMENT設定 SET @upsert_statement = - '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) + 'INSERT INTO internal07.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 = CURRENT_USER(), ins_date = CURRENT_TIMESTAMP(), NULL, NULL) - + ?, src07.get_syor_date(),?, ?, + IFNULL(?, 0), + IFNULL(?, 0), + CURRENT_USER(), CURRENT_TIMESTAMP(), NULL, NULL + ) ON DUPLICATE KEY UPDATE - process_type = ?, - process_status = ?, - total_run_count = ?, - max_run_count_flg = ?, + process_type = CASE WHEN ? is NULL THEN process_type ELSE ? END, + process_status = CASE WHEN ? is NULL THEN process_status ELSE ? END, + total_run_count = CASE WHEN ? is NULL THEN total_run_count ELSE ? END, + max_run_count_flg = CASE WHEN ? is NULL THEN max_run_count_flg ELSE ? END, upd_user = CURRENT_USER(), upd_date = CURRENT_TIMESTAMP();'; --- 日付テーブルから処理年月日を取得 -SET @select_process_date_statement = 'SELECT syor_date INTO get_value FROM src07.hdke_tbl'; - -PREPARE stmt FROM @select_process_date_statement; -EXECUTE stmt: -DEALLOCATE PREPARE stmt; -SET @insert_process_date = get_value; - --- 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); - - --- 引数がNULLであるときに更新前の値を取得するためのステートメント設定 -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; +SET @process_name = process_name; +SET @process_type = process_type; +SET @process_status = process_status; +SET @total_run_count = total_run_count; +SET @max_run_count_flg = max_run_count_flg; -- 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; +EXECUTE stmt USING +@process_name, @process_type, @process_status, @total_run_count, @max_run_count_flg, +@process_type, @process_type, @process_status, @process_status, @total_run_count, @total_run_count, @max_run_count_flg, @max_run_count_flg; DEALLOCATE PREPARE stmt; COMMIT; -END \ No newline at end of file +END; \ No newline at end of file