diff --git a/rds_mysql/stored_procedure/internal02/get_distribution_to_schema.sql b/rds_mysql/stored_procedure/internal02/get_distribution_to_schema.sql new file mode 100644 index 00000000..9eb02059 --- /dev/null +++ b/rds_mysql/stored_procedure/internal02/get_distribution_to_schema.sql @@ -0,0 +1,66 @@ +-- A5M2で実行時に[SQL] - [スラッシュ(/)のみの行でSQLを区切る]に変えてから実行する +-- $$から始まる文字は後からREPLACEする文字を示す独自ルール +CREATE FUNCTION `get_distribution_to_schema`(target_table VARCHAR(100), target_column VARCHAR(100), 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 intenal02.`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