diff --git a/rds_mysql/stored_procedure/crm_history.sql b/rds_mysql/stored_procedure/crm_history.sql index 7573bf9b..b60e2681 100644 --- a/rds_mysql/stored_procedure/crm_history.sql +++ b/rds_mysql/stored_procedure/crm_history.sql @@ -1,5 +1,6 @@ -- A5M2で実行時にSQL区切り文字を「;」以外にすること --- $$から始まる文字は後からREPLACEする文字を示す独自ルール +-- $$から始まり$$で終わる文字は後からREPLACEする文字を示す独自ルール +-- crm_historyストアドプロシージャは、同一セッション内での並列処理を実行することができない CREATE PROCEDURE crm_history(target_table VARCHAR(255), target_column VARCHAR(255)) BEGIN -- 例外処理 @@ -15,21 +16,22 @@ BEGIN SET MYSQL_ERRNO = @error_state, MESSAGE_TEXT = @error_msg; END; + SET @error_state = NULL, @error_msg = NULL; START TRANSACTION; -- ②-3で利用する一時テーブル削除のSQLを準備 -- 例外処理でも利用するため先に記述 SET @drop_tmp_table = ' - DROP TEMPORARY TABLE IF EXISTS $$target_table_make_history_tmp + DROP TEMPORARY TABLE IF EXISTS $$target_table$$_make_history_tmp '; - SET @drop_tmp_table = REPLACE(@drop_tmp_table, "$$target_table", target_table); + SET @drop_tmp_table = REPLACE(@drop_tmp_table, "$$target_table$$", target_table); PREPARE drop_tmp_table_stmt from @drop_tmp_table; -- ①-1 Salesforce側で更新されたデータの適用開始日時と適用終了日時を設定する SET @new_history_save = ' - UPDATE $$target_table + UPDATE $$target_table$$ SET - start_datetime = $$target_column + start_datetime = $$target_column$$ , end_datetime = "9999-12-31 00:00:00" , upd_user = CURRENT_USER() , upd_date = CURRENT_TIMESTAMP() @@ -37,21 +39,21 @@ BEGIN start_datetime IS NULL AND end_datetime IS NULL '; - SET @new_history_save = REPLACE(@new_history_save, "$$target_table", target_table); - SET @new_history_save = REPLACE(@new_history_save, "$$target_column", target_column); + SET @new_history_save = REPLACE(@new_history_save, "$$target_table$$", target_table); + SET @new_history_save = REPLACE(@new_history_save, "$$target_column$$", target_column); PREPARE new_history_save_stmt from @new_history_save; EXECUTE new_history_save_stmt; DEALLOCATE PREPARE new_history_save_stmt; -- ②-1 Salesforce側で更新されたデータを検出用一時テーブルの作成 SET @make_history_tmp_create = ' - CREATE TEMPORARY TABLE $$target_table_make_history_tmp + CREATE TEMPORARY TABLE $$target_table$$_make_history_tmp SELECT id - , MIN($$target_column) AS min_start_datetime + , MIN($$target_column$$) AS min_start_datetime , MAX(start_datetime) AS max_start_datetime FROM - $$target_table + $$target_table$$ WHERE end_datetime = "9999-12-31 00:00:00" GROUP BY @@ -59,16 +61,16 @@ BEGIN HAVING count(id) = 2 '; - SET @make_history_tmp_create = REPLACE(@make_history_tmp_create, "$$target_table", target_table); - SET @make_history_tmp_create = REPLACE(@make_history_tmp_create, "$$target_column", target_column); + SET @make_history_tmp_create = REPLACE(@make_history_tmp_create, "$$target_table$$", target_table); + SET @make_history_tmp_create = REPLACE(@make_history_tmp_create, "$$target_column$$", target_column); PREPARE make_history_tmp_create_stmt from @make_history_tmp_create; EXECUTE make_history_tmp_create_stmt; DEALLOCATE PREPARE make_history_tmp_create_stmt; -- ②-2 「②-1」で取得した全件に更新処理を行う SET @update_end_datetime = ' - UPDATE $$target_table tt - LEFT JOIN $$target_table_make_history_tmp mht + UPDATE $$target_table$$ tt + LEFT JOIN $$target_table$$_make_history_tmp mht ON tt.id = mht.id AND tt.start_datetime = mht.min_start_datetime SET @@ -78,8 +80,8 @@ BEGIN WHERE mht.id IS NOT NULL '; - SET @update_end_datetime = REPLACE(@update_end_datetime, "$$target_table", target_table); - SET @update_end_datetime = REPLACE(@update_end_datetime, "$$target_column", target_column); + SET @update_end_datetime = REPLACE(@update_end_datetime, "$$target_table$$", target_table); + SET @update_end_datetime = REPLACE(@update_end_datetime, "$$target_column$$", target_column); PREPARE update_end_datetime_stmt from @update_end_datetime; EXECUTE update_end_datetime_stmt; DEALLOCATE PREPARE update_end_datetime_stmt;