-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する -- $$から始まる文字は後からREPLACEする文字を示す独自ルール -- crm_data_syncストアドプロシージャは、同一セッション内での並列処理を実行することができない -- 実行者の権限でストアドプロシージャを実行するために、「SQL SECURITY INVOKER」を付与している CREATE PROCEDURE src02.crm_data_sync(target_table VARCHAR(255), target_table_all VARCHAR(255), target_column VARCHAR(255)) SQL SECURITY INVOKER BEGIN -- 例外処理 -- エラーが発生した場合に一時テーブルの削除を実施 DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN GET DIAGNOSTICS CONDITION 1 @error_state = RETURNED_SQLSTATE, @error_msg = MESSAGE_TEXT; ROLLBACK; SIGNAL SQLSTATE '45000' SET MYSQL_ERRNO = @error_state, MESSAGE_TEXT = @error_msg; END; SET @error_state = NULL, @error_msg = NULL; START TRANSACTION; -- ①-1 Salesforce側で物理削除されたデータを検出し更新する SET @update_end_datetime = ' UPDATE $$target_table$$ tt SET tt.end_datetime = CURRENT_TIMESTAMP () , tt.upd_user = CURRENT_USER () , tt.upd_date = CURRENT_TIMESTAMP () WHERE tt.end_datetime = "9999-12-31 00:00:00" AND NOT EXISTS ( SELECT tta.Id FROM $$target_table_all$$ tta WHERE tt.Id = tta.Id AND tt.$$target_column$$ = tta.$$target_column$$ ) '; SET @update_end_datetime = REPLACE(@update_end_datetime, "$$target_table$$", target_table); SET @update_end_datetime = REPLACE(@update_end_datetime, "$$target_table_all$$", target_table_all); 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; COMMIT; END