-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する
-- $$から始まる文字は後からREPLACEする文字を示す独自ルール
-- 当プロシージャは、同一セッション内での並列処理を実行することができない
-- 実行者の権限でストアドプロシージャを実行するために、「SQL SECURITY INVOKER」を付与している
CREATE PROCEDURE `internal02`.`crm_distribution_Call_Clickstream_vod__c`()
SQL SECURITY INVOKER
BEGIN

-- 振り分けスキーマ
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, medaca_parent_record_type_id FROM internal02.crm_Call_Clickstream_vod__c;
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;

START TRANSACTION;

-- UPSERT STATEMENT設定
SET @upsert_statement_base =
    'INSERT INTO $$distribution_schema$$.crm_Call_Clickstream_vod__c
        (Id, IsDeleted, Name, CreatedDate, CreatedById, LastModifiedDate, LastModifiedById, SystemModstamp, MayEdit,
        IsLocked, Answer_vod__c, Call_vod__c, Key_Message_vod__c, Mobile_ID_vod__c, Popup_Opened_vod__c,
        Possible_Answers_vod__c, Presentation_ID_vod__c, Product_vod__c, Range_Value_vod__c, Rollover_Entered_vod__c,
        Selected_Items_vod__c, CLM_ID_vod__c, Question_vod__c, Survey_Type_vod__c, Text_Entered_vod__c,
        Toggle_Button_On_vod__c, Track_Element_Description_vod__c, Track_Element_Id_vod__c, Track_Element_Type_vod__c,
        Usage_Duration_vod__c, Usage_Start_Time_vod__c, AuxillaryId_vod__c, ParentId_vod__c, Revision_vod__c,
        medaca_parent_record_type_id, file_name, file_row_cnt, delete_flg, ins_user, ins_date, upd_user, upd_date)
    SELECT
        Id, IsDeleted, Name, CreatedDate, CreatedById, LastModifiedDate, LastModifiedById, SystemModstamp, MayEdit,
        IsLocked, Answer_vod__c, Call_vod__c, Key_Message_vod__c, Mobile_ID_vod__c, Popup_Opened_vod__c,
        Possible_Answers_vod__c, Presentation_ID_vod__c, Product_vod__c, Range_Value_vod__c, Rollover_Entered_vod__c,
        Selected_Items_vod__c, CLM_ID_vod__c, Question_vod__c, Survey_Type_vod__c, Text_Entered_vod__c,
        Toggle_Button_On_vod__c, Track_Element_Description_vod__c, Track_Element_Id_vod__c, Track_Element_Type_vod__c,
        Usage_Duration_vod__c, Usage_Start_Time_vod__c, AuxillaryId_vod__c, ParentId_vod__c, Revision_vod__c,
        medaca_parent_record_type_id, file_name, file_row_cnt, delete_flg, ins_user, ins_date, upd_user, upd_date
    FROM
        internal02.crm_Call_Clickstream_vod__c AS internaltb
    WHERE
        internaltb.Id = ?
    ON DUPLICATE KEY UPDATE
        Id = internaltb.Id, IsDeleted = internaltb.IsDeleted, Name = internaltb.Name,
        CreatedDate = internaltb.CreatedDate, CreatedById = internaltb.CreatedById,
        LastModifiedDate = internaltb.LastModifiedDate, LastModifiedById = internaltb.LastModifiedById,
        SystemModstamp = internaltb.SystemModstamp, MayEdit = internaltb.MayEdit, IsLocked = internaltb.IsLocked,
        Answer_vod__c = internaltb.Answer_vod__c, Call_vod__c = internaltb.Call_vod__c,
        Key_Message_vod__c = internaltb.Key_Message_vod__c, Mobile_ID_vod__c = internaltb.Mobile_ID_vod__c,
        Popup_Opened_vod__c = internaltb.Popup_Opened_vod__c, Possible_Answers_vod__c = internaltb.Possible_Answers_vod__c,
        Presentation_ID_vod__c = internaltb.Presentation_ID_vod__c, Product_vod__c = internaltb.Product_vod__c,
        Range_Value_vod__c = internaltb.Range_Value_vod__c, Rollover_Entered_vod__c = internaltb.Rollover_Entered_vod__c,
        Selected_Items_vod__c = internaltb.Selected_Items_vod__c, CLM_ID_vod__c = internaltb.CLM_ID_vod__c,
        Question_vod__c = internaltb.Question_vod__c, Survey_Type_vod__c = internaltb.Survey_Type_vod__c,
        Text_Entered_vod__c = internaltb.Text_Entered_vod__c, Toggle_Button_On_vod__c = internaltb.Toggle_Button_On_vod__c,
        Track_Element_Description_vod__c = internaltb.Track_Element_Description_vod__c,
        Track_Element_Id_vod__c = internaltb.Track_Element_Id_vod__c, Track_Element_Type_vod__c = internaltb.Track_Element_Type_vod__c,
        Usage_Duration_vod__c = internaltb.Usage_Duration_vod__c, Usage_Start_Time_vod__c = internaltb.Usage_Start_Time_vod__c,
        AuxillaryId_vod__c = internaltb.AuxillaryId_vod__c, ParentId_vod__c = internaltb.ParentId_vod__c,
        Revision_vod__c = internaltb.Revision_vod__c, medaca_parent_record_type_id = internaltb.medaca_parent_record_type_id,
        file_name = internaltb.file_name, file_row_cnt = internaltb.file_row_cnt,
        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 = internal02.get_distribution_to_schema('crm_Call_Clickstream_vod__c', 'medaca_parent_record_type_id', target_column_value);
    SET @temp_table_id = temp_table_id;

    SET @upsert_statement = REPLACE(@upsert_statement_base, "$$distribution_schema$$", @distribution_schema);

    -- UPSERT実行
    PREPARE stmt FROM @upsert_statement;
    EXECUTE stmt USING @temp_table_id;
    DEALLOCATE PREPARE stmt;

END LOOP;
CLOSE table_cursor;
COMMIT;

END