DELIMITER // CREATE OR REPLACE PROCEDURE `sysexec` ( IN p_token VARCHAR(100), IN p_sql LONGTEXT ) /* function : 傳入 Insert/Update 的 sql 指令並執行 description: 不允許 drop delete 這類的 sql 語法 build date : 2018/05/05 modify history item who date modify docs ==== ========== ========== ================================================ 1 Michael 2018-11-05 init 2 [改寫者] 2023-11-15 改寫為 MariaDB 版本並最佳化 */ BEGIN DECLARE v_userid VARCHAR(100); DECLARE v_exstr LONGTEXT; DECLARE v_code INT; DECLARE v_msg VARCHAR(255); -- 根據傳入的 token 取得 userid SELECT userid INTO v_userid FROM sys_users WHERE token = p_token LIMIT 1; IF v_userid IS NULL THEN SET v_code = 9; SET v_msg = '請先登入系統再執行!!'; SELECT v_code AS code, v_msg AS msg; SELECT ''; ELSEIF LOCATE('delete ', LOWER(p_sql)) > 0 OR LOCATE('drop ', LOWER(p_sql)) > 0 THEN SET v_code = 4; SET v_msg = '內含不允許執行的 sql 語法, 請重新輸入?!'; SELECT v_code AS code, v_msg AS msg; SELECT ''; ELSE BEGIN DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN SET v_code = 9; SET v_msg = '語法有錯,請檢查語法後再重新執行!!'; SELECT v_code AS code, v_msg AS msg; SELECT ''; END; SET v_code = 0; SET v_msg = '成功執行 SQL 語法'; SELECT v_code AS code, v_msg AS msg; SET @dynamic_sql = p_sql; PREPARE stmt FROM @dynamic_sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END; END IF; END // DELIMITER ;