-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する
-- $$から始まる文字は後からREPLACEする文字を示す独自ルール
CREATE FUNCTION internal02.`get_distribution_to_schema`(target_table VARCHAR(64), target_column VARCHAR(64), target_column_value VARCHAR(100))
RETURNS VARCHAR(20)
DETERMINISTIC

BEGIN
    -- 返却値
    DECLARE ret VARCHAR(20) DEFAULT NULL;
    -- other振分先蓄積スキーマ
    DECLARE distribution_schema_other VARCHAR(20) DEFAULT NULL;
    -- 振分判断項目値
    DECLARE value_from_column_value VARCHAR(100) DEFAULT NULL;
    -- 振分先蓄積スキーマ
    DECLARE value_to_schema VARCHAR(20) DEFAULT NULL;

    -- カーソルがデータセットの最後に達したか判定するための変数
    DECLARE done INT DEFAULT FALSE;

    -- カーソル
    DECLARE cursor_crm_data_distribution_settings CURSOR FOR
        SELECT `from_column_value`, `to_schema`
        FROM internal02.`crm_data_distribution_settings`
        WHERE `table_id` = target_table
            AND `from_column_id` = target_column;

    -- カーソルがデータセットをフェッチしきった時の動作を制御
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN cursor_crm_data_distribution_settings;

    read_loop: LOOP
        FETCH cursor_crm_data_distribution_settings INTO value_from_column_value, value_to_schema;

        -- カーソルの読み出しが完了していればループを抜ける
        IF done THEN
            LEAVE read_loop;
        END IF;

        IF value_from_column_value = target_column_value THEN
            SET ret = value_to_schema;
        END IF;

         -- カーソルから読み出した行が'other'かを判断
        IF value_from_column_value = 'other' THEN
            SET distribution_schema_other = value_to_schema;
        END IF;
    END LOOP;

    CLOSE cursor_crm_data_distribution_settings;

    -- 例外処理
    IF distribution_schema_other IS NULL THEN
        SET @error_msg = 'データ振分設定テーブルにotherの設定がされていません。テーブルID: $$target_table$$, 振分判断項目ID: $$target_column$$';
        SET @error_msg = REPLACE(@error_msg, "$$target_table$$", target_table);
        SET @error_msg = REPLACE(@error_msg, "$$target_column$$", target_column);
        SIGNAL SQLSTATE '45000'
            SET MESSAGE_TEXT = @error_msg;
    END IF;

    IF ret IS NULL THEN
        SET ret = distribution_schema_other;
    END IF;

    RETURN ret;
END