DELIMITER // CREATE OR REPLACE PROCEDURE orm_exec_aftersave_v2( IN p_tablename VARCHAR(100), IN p_pk VARCHAR(100), -- primary key(for update delete) IN p_action VARCHAR(10), IN p_userid VARCHAR(100) ) /* 功能: orm_api_v2 [存档后处理]的核心程序,智能构建相应SQL 描述: 用于保存后执行额外处理逻辑 创建日期: 2023/12/16 MariaDB转换版本 */ BEGIN DECLARE v_sp_name TEXT; DECLARE v_para01 TEXT; DECLARE v_para02 TEXT; DECLARE v_sql_command TEXT; DECLARE v_dest_table TEXT; DECLARE v_dest_field TEXT; DECLARE v_dest_field2 TEXT; DECLARE v_RelationKey TEXT; DECLARE v_filter_user_fieldname TEXT; DECLARE v_max_id INT; -- 取得 sys_transaction 信息 SELECT sp_name, para01, para02, dest_table, dest_field, dest_field2, RelationKey, filter_user_fieldname INTO v_sp_name, v_para01, v_para02, v_dest_table, v_dest_field, v_dest_field2, v_RelationKey, v_filter_user_fieldname FROM sys_transaction WHERE tablename = p_tablename AND (actiontype = '*' OR LOCATE(p_action, actiontype) > 0) LIMIT 1; IF v_sp_name IS NOT NULL AND v_sp_name != '' THEN -- 检查是否为特殊情况 IF (v_sp_name != 'sys_transfer_owned2rolemenusecurity') AND (v_sp_name != 'sys_transfer_owned2userroles') THEN -- 如果 pk 是 identity IF v_para01 = 'identity' THEN -- 处理 identity 的情况 IF IFNULL(v_filter_user_fieldname, '') = '' THEN SET @sql = CONCAT('SELECT MAX(', p_pk, ') INTO @max_id FROM ', p_tablename); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET v_sql_command = CONCAT('UPDATE sys_transaction SET para01 = ? WHERE tablename = ''', p_tablename, ''''); PREPARE stmt FROM v_sql_command; EXECUTE stmt USING @max_id; DEALLOCATE PREPARE stmt; ELSE SET @sql = CONCAT('SELECT MAX(', p_pk, ') INTO @max_id FROM ', p_tablename, ' WHERE ', v_filter_user_fieldname, ' = ''', p_userid, ''''); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET v_sql_command = CONCAT('UPDATE sys_transaction SET para01 = ? WHERE tablename = ''', p_tablename, ''''); PREPARE stmt FROM v_sql_command; EXECUTE stmt USING @max_id; DEALLOCATE PREPARE stmt; END IF; END IF; SET v_sql_command = CONCAT('CALL ', v_sp_name, '( ''', p_tablename, ''' )'); ELSE -- 针对特殊情况特别改写 sp 的方案 IF IFNULL(v_para01, '') != '' AND IFNULL(v_para02, '') != '' THEN SET v_sql_command = CONCAT('CALL ', v_sp_name, '( ''', v_para01, ''', ''', v_para02, ''' )'); ELSEIF IFNULL(v_para01, '') != '' AND IFNULL(v_para02, '') = '' THEN SET v_sql_command = CONCAT('CALL ', v_sp_name, '( ''', v_para01, ''' )'); ELSE SET v_sql_command = CONCAT('CALL ', v_sp_name, '()'); END IF; END IF; -- 执行 SQL SET @dynamic_sql = v_sql_command; PREPARE stmt FROM @dynamic_sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END IF; END // DELIMITER ;