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

-- 振り分けスキーマ
DECLARE distribution_schema VARCHAR(20);
-- 振り分けカラム
DECLARE target_column_value VARCHAR(100);
-- 振り分け先テーブルID
DECLARE temp_table_id VARCHAR(18);
-- 振り分け先テーブルのSystemModstamp
DECLARE temp_system_modstamp DATETIME;
-- カーソルフェッチステータス
DECLARE fetch_done BOOLEAN DEFAULT FALSE;

-- カーソル設定
DECLARE table_cursor CURSOR FOR SELECT Id, SystemModstamp, medaca_parent_msj_product_classification__c FROM internal02.crm_Product_Metrics_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_Product_Metrics_vod__c
		(Id, IsDeleted, Name, CreatedDate, CreatedById, LastModifiedDate, LastModifiedById, SystemModstamp, 
        MayEdit, IsLocked, LastViewedDate, LastReferencedDate, Account_vod__c, Awareness__c, Selling_Stage__c, 
        Formulary_Status__c, Movement__c, Products_vod__c, Segment__c, X12_mo_trx_chg__c, Speaker_Skills__c, 
        Investigator_Readiness__c, Engagements__c, Mobile_ID_vod__c, External_ID_vod__c, MSJ_Patient__c, 
        Detail_Group_vod__c, MSJ_EB_1st_Line_Liver_Meta__c, MSJ_EB_1st_Line_Multi_Meta__c, MSJ_EB_2nd_Line_Mono__c, 
        MSJ_EB_2nd_Line_Combination__c, MSJ_EB_3rd_Line_Mono__c, MSJ_EB_3rd_Line_Combination__c, EMDS_Ability__c, 
        EMDS_Brand_Loyalty__c, EMDS_Decision_Maker__c, EMDS_Early_Tech_Adopter__c, EMDS_Influence__c, 
        EMDS_Main_Driver__c, EMDS_Priority__c, EMDS_Willingness__c, MSJ_KTL_Type__c, MSJ_KTL_Tier__c, 
        MSJ_Publications__c, MSJ_Clinical_Trials__c, MSJ_Speaker_for_Medical_Events__c, 
        MSJ_Advisor_to_Medical_Affairs__c, MSJ_Guidelines_Treatment_Standards__c, MSJ_Therapeutic_Area_Expertise__c, 
        MSJ_MAP_GAP__c, MSJ_Associations__c, MSJ_Tier_Score__c, MSJ_Primary_Medical_Focus__c,
        MSJ_Secondary_Medical_Focus__c, MSJ_Tertiary_Medical_Focus__c, medaca_parent_msj_product_classification__c, 
        start_datetime, end_datetime, 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, LastViewedDate, LastReferencedDate, Account_vod__c, Awareness__c, Selling_Stage__c, 
        Formulary_Status__c, Movement__c, Products_vod__c, Segment__c, X12_mo_trx_chg__c, Speaker_Skills__c, 
        Investigator_Readiness__c, Engagements__c, Mobile_ID_vod__c, External_ID_vod__c, MSJ_Patient__c, 
        Detail_Group_vod__c, MSJ_EB_1st_Line_Liver_Meta__c, MSJ_EB_1st_Line_Multi_Meta__c, MSJ_EB_2nd_Line_Mono__c, 
        MSJ_EB_2nd_Line_Combination__c, MSJ_EB_3rd_Line_Mono__c, MSJ_EB_3rd_Line_Combination__c, EMDS_Ability__c, 
        EMDS_Brand_Loyalty__c, EMDS_Decision_Maker__c, EMDS_Early_Tech_Adopter__c, EMDS_Influence__c, 
        EMDS_Main_Driver__c, EMDS_Priority__c, EMDS_Willingness__c, MSJ_KTL_Type__c, MSJ_KTL_Tier__c, 
        MSJ_Publications__c, MSJ_Clinical_Trials__c, MSJ_Speaker_for_Medical_Events__c, 
        MSJ_Advisor_to_Medical_Affairs__c, MSJ_Guidelines_Treatment_Standards__c, MSJ_Therapeutic_Area_Expertise__c, 
        MSJ_MAP_GAP__c, MSJ_Associations__c, MSJ_Tier_Score__c, MSJ_Primary_Medical_Focus__c,
        MSJ_Secondary_Medical_Focus__c, MSJ_Tertiary_Medical_Focus__c, medaca_parent_msj_product_classification__c, 
        start_datetime, end_datetime, file_name, file_row_cnt, delete_flg, ins_user, ins_date, upd_user, upd_date
    FROM
        internal02.crm_Product_Metrics_vod__c AS internaltb
    WHERE
            internaltb.Id = ?
        AND internaltb.SystemModstamp = ?
    ON DUPLICATE KEY UPDATE
        IsDeleted = internaltb.IsDeleted, Name = internaltb.Name, CreatedDate = internaltb.CreatedDate,
        CreatedById = internaltb.CreatedById, LastModifiedDate = internaltb.LastModifiedDate,
        LastModifiedById = internaltb.LastModifiedById,
        MayEdit = internaltb.MayEdit, IsLocked = internaltb.IsLocked, LastViewedDate = internaltb.LastViewedDate,
        LastReferencedDate = internaltb.LastReferencedDate, Account_vod__c = internaltb.Account_vod__c,
        Awareness__c = internaltb.Awareness__c, Selling_Stage__c = internaltb.Selling_Stage__c,
        Formulary_Status__c = internaltb.Formulary_Status__c, Movement__c = internaltb.Movement__c,
        Products_vod__c = internaltb.Products_vod__c, Segment__c = internaltb.Segment__c,
        X12_mo_trx_chg__c = internaltb.X12_mo_trx_chg__c, Speaker_Skills__c = internaltb.Speaker_Skills__c,
        Investigator_Readiness__c = internaltb.Investigator_Readiness__c, Engagements__c = internaltb.Engagements__c,
        Mobile_ID_vod__c = internaltb.Mobile_ID_vod__c, External_ID_vod__c = internaltb.External_ID_vod__c,
        MSJ_Patient__c = internaltb.MSJ_Patient__c, Detail_Group_vod__c = internaltb.Detail_Group_vod__c,
        MSJ_EB_1st_Line_Liver_Meta__c = internaltb.MSJ_EB_1st_Line_Liver_Meta__c,
        MSJ_EB_1st_Line_Multi_Meta__c = internaltb.MSJ_EB_1st_Line_Multi_Meta__c,
        MSJ_EB_2nd_Line_Mono__c = internaltb.MSJ_EB_2nd_Line_Mono__c,
        MSJ_EB_2nd_Line_Combination__c = internaltb.MSJ_EB_2nd_Line_Combination__c,
        MSJ_EB_3rd_Line_Mono__c = internaltb.MSJ_EB_3rd_Line_Mono__c,
        MSJ_EB_3rd_Line_Combination__c = internaltb.MSJ_EB_3rd_Line_Combination__c,
        EMDS_Ability__c = internaltb.EMDS_Ability__c, EMDS_Brand_Loyalty__c = internaltb.EMDS_Brand_Loyalty__c,
        EMDS_Decision_Maker__c = internaltb.EMDS_Decision_Maker__c,
        EMDS_Early_Tech_Adopter__c = internaltb.EMDS_Early_Tech_Adopter__c,
        EMDS_Influence__c = internaltb.EMDS_Influence__c, EMDS_Main_Driver__c = internaltb.EMDS_Main_Driver__c,
        EMDS_Priority__c = internaltb.EMDS_Priority__c, EMDS_Willingness__c = internaltb.EMDS_Willingness__c,
        MSJ_KTL_Type__c = internaltb.MSJ_KTL_Type__c, MSJ_KTL_Tier__c = internaltb.MSJ_KTL_Tier__c,
        MSJ_Publications__c = internaltb.MSJ_Publications__c, MSJ_Clinical_Trials__c = internaltb.MSJ_Clinical_Trials__c,
        MSJ_Speaker_for_Medical_Events__c = internaltb.MSJ_Speaker_for_Medical_Events__c,
        MSJ_Advisor_to_Medical_Affairs__c = internaltb.MSJ_Advisor_to_Medical_Affairs__c,
        MSJ_Guidelines_Treatment_Standards__c = internaltb.MSJ_Guidelines_Treatment_Standards__c,
        MSJ_Therapeutic_Area_Expertise__c = internaltb.MSJ_Therapeutic_Area_Expertise__c,
        MSJ_MAP_GAP__c = internaltb.MSJ_MAP_GAP__c, MSJ_Associations__c = internaltb.MSJ_Associations__c,
        MSJ_Tier_Score__c = internaltb.MSJ_Tier_Score__c,
        MSJ_Primary_Medical_Focus__c = internaltb.MSJ_Primary_Medical_Focus__c,
        MSJ_Secondary_Medical_Focus__c = internaltb.MSJ_Secondary_Medical_Focus__c,
        MSJ_Tertiary_Medical_Focus__c = internaltb.MSJ_Secondary_Medical_Focus__c,
        medaca_parent_msj_product_classification__c = internaltb.medaca_parent_msj_product_classification__c,
        start_datetime = internaltb.start_datetime, end_datetime = internaltb.end_datetime,
        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, temp_system_modstamp, target_column_value;

    -- 終了条件ループ抜き
    IF fetch_done THEN
        LEAVE TableCursorLoop;
    END IF;

    SET @distribution_schema = internal02.get_distribution_to_schema('crm_Product_Metrics_vod__c', 'medaca_parent_msj_product_classification__c', target_column_value);
    SET @temp_table_id = temp_table_id;
    SET @temp_system_modstamp = temp_system_modstamp;

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

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

END LOOP;
CLOSE table_cursor;
COMMIT;

END