Files
Omni_orm.db/orm_exec_aftersave_v2.txt
2026-02-06 14:31:07 +08:00

100 lines
3.6 KiB
Plaintext

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 ;