DELIMITER // CREATE OR REPLACE PROCEDURE sys_d_update_m3( IN p_tablename VARCHAR(100) ) /* function : 配合 orm_api 的存檔後過帳, 當新增一筆 detail 後, update master 的合計欄位(目前先寫死 totalamount) description: 目前先配合 omi_api 的存檔後機制(sys_transaction) 執行, 希望能全部透過設定, 而不是每一個 table 都必須客製 build date : 2023/10/14 modify history item who date modify docs ==== ========== ========== ================================================ 1 michael 2023-10-14 Init 2 Michael 2025/07/20 改寫為 MariaDB 並最佳化(ChatGPT+DeepSeek) */ BEGIN DECLARE v_relation_key VARCHAR(100); DECLARE v_middle_field VARCHAR(100); DECLARE v_dest_table VARCHAR(100); DECLARE v_dest_field VARCHAR(100); DECLARE v_dest_field2 VARCHAR(100); DECLARE v_sql TEXT; DECLARE v_para01 VARCHAR(100); DECLARE v_para02 VARCHAR(100); DECLARE v_pos INT; DECLARE v_source_field VARCHAR(100); DECLARE v_source_field2 VARCHAR(100); -- get data SELECT IFNULL(RelationKey,''), IFNULL(MiddleField,''), IFNULL(para01,''), IFNULL(para02,''), IFNULL(dest_table,''), IFNULL(dest_field,''), IFNULL(dest_field2,'') INTO v_relation_key, v_middle_field, v_para01, v_para02, v_dest_table, v_dest_field, v_dest_field2 FROM sys_transaction WHERE tablename = p_tablename; -- prepare sql SET v_pos = LOCATE('=', v_dest_field); IF v_pos > 0 THEN SET v_source_field = SUBSTRING(v_dest_field, 1, v_pos-1); SET v_dest_field = SUBSTRING(v_dest_field, v_pos+1); END IF; SET v_pos = LOCATE('=', v_dest_field2); IF v_pos > 0 THEN SET v_source_field2 = SUBSTRING(v_dest_field2, 1, v_pos-1); SET v_dest_field2 = SUBSTRING(v_dest_field2, v_pos+1); END IF; -- build SQL IF v_dest_field2 IS NULL OR v_dest_field2 = '' THEN SET @sql = CONCAT( 'UPDATE ', v_dest_table, ' d ', 'JOIN (SELECT ', v_middle_field, ', ', v_source_field, ' FROM ', p_tablename, ' WHERE ', v_relation_key, ' = ''', v_para01, ''') s ', 'ON d.', v_middle_field, ' = s.', v_middle_field, ' ', 'SET d.', v_dest_field, ' = s.', v_source_field, ';' ); ELSE SET @sql = CONCAT( 'UPDATE ', v_dest_table, ' d ', 'JOIN (SELECT ', v_middle_field, ', ', v_source_field, ', ', v_source_field2, ' FROM ', p_tablename, ' WHERE ', v_relation_key, ' = ''', v_para01, ''') s ', 'ON d.', v_middle_field, ' = s.', v_middle_field, ' ', 'SET d.', v_dest_field, ' = s.', v_source_field, ', d.', v_dest_field2, ' = s.', v_source_field2, ';' ); END IF; -- exec SQL PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END // DELIMITER ;