first commit
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
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 ;
|
||||
Reference in New Issue
Block a user