DELIMITER //
CREATE OR REPLACE PROCEDURE sys_transfer_comm(
  IN p_para_tablename VARCHAR(100)
)
/*
  function   : 配合 amis 的 transfer 元件, 將暫存在 owned(or else) 欄位的值, 寫到指定的 table(透過設定)
  description: 目前先配合 omi_api 的存檔後機制(sys_transaction) 執行, 希望能全部透過設定, 而不是每一個 table 都必須客製
               copy from sys_transfer_owned2rolemenusecurity
  build date : 2022/04/08
  
  modify history
    item who        date       modify docs
    ==== ========== ========== ================================================
    1    michael    2022-4-9   測試
	2    Michael    2025/07/20 改寫為 MariaDB 並最佳化(ChatGPT+DeepSeek)
*/
BEGIN
  /*
    Function: Transfer data from temporary fields to specified tables
    Build Date: 2022/04/08
  */
  DECLARE v_RelationKey VARCHAR(100);
  DECLARE v_MiddleField VARCHAR(100);
  DECLARE v_dest_table VARCHAR(100);
  DECLARE v_dest_field VARCHAR(100);
  DECLARE v_dest_field2 VARCHAR(100);
  DECLARE v_dest_field2_value VARCHAR(100);
  DECLARE v_sql LONGTEXT;
  DECLARE v_para01 VARCHAR(100);
  DECLARE v_para02 VARCHAR(100);
  
  -- Read parameters from sys_transaction
  SELECT 
    RelationKey, MiddleField, para01, para02,
    dest_table, dest_field, dest_field2, dest_field2_value
  INTO
    v_RelationKey, v_MiddleField, v_para01, v_para02,
    v_dest_table, v_dest_field, v_dest_field2, v_dest_field2_value
  FROM sys_transaction WHERE tablename = p_para_tablename;
  
  -- Build dynamic SQL
  SET v_sql = CONCAT(
    'DELETE FROM ', v_dest_table, ' WHERE ', v_RelationKey, ' = ''', v_para01, ''';'
  );
  
  IF v_dest_field2 IS NOT NULL AND v_dest_field2 != '' THEN
    SET v_sql = CONCAT(v_sql,
      ' INSERT INTO ', v_dest_table, ' (', v_RelationKey, ',', v_dest_field, ',', v_dest_field2, ') ',
      'SELECT t.', v_RelationKey, ', s.col, ''', v_dest_field2_value, ''' ',
      'FROM ', p_para_tablename, ' t ',
      'JOIN (SELECT col FROM STRING_SPLIT((SELECT ', v_MiddleField, ' FROM ', p_para_tablename, 
      ' WHERE ', v_RelationKey, ' = ''', v_para01, '''), '','') WHERE col != '''') s ',
      'WHERE t.', v_RelationKey, ' = ''', v_para01, ''';'
    );
  ELSE
    SET v_sql = CONCAT(v_sql,
      ' INSERT INTO ', v_dest_table, ' (', v_RelationKey, ',', v_dest_field, ') ',
      'SELECT t.', v_RelationKey, ', s.col ',
      'FROM ', p_para_tablename, ' t ',
      'JOIN (SELECT col FROM STRING_SPLIT((SELECT ', v_MiddleField, ' FROM ', p_para_tablename, 
      ' WHERE ', v_RelationKey, ' = ''', v_para01, '''), '','') WHERE col != '''') s ',
      'WHERE t.', v_RelationKey, ' = ''', v_para01, ''';'
    );
  END IF;
  
  SET @sql = v_sql;
  PREPARE stmt FROM @sql;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END //
DELIMITER ;