-- 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
