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 ;