CREATE PROCEDURE 過程名 ([過程參數[,...]])
[特性 ...] 過程體
CREATE FUNCTION 函數名 ([函數參數[,...]])
RETURNS 返回類型
[特性 ...] 函數體
[ IN | OUT | INOUT ] 參數名 參數類型參數名 參數類型(無 IN/OUT)
LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'
本文不涉及與 SQL 標準不兼容的專有特性。
BEGIN
有效 SQL 語句
END
-- (行註釋) 與 /* */ (區塊註釋)DECLARE,暫時變數可用 @ 前綴直接引用; 為分隔符,腳本導入時過程體內每句會被誤判為結束。必須先用 DELIMITER 宣告自訂分隔符,結束後還原:
DELIMITER $$
-- 儲存過程/函數定義
DELIMITER ;
CREATE FUNCTION fun_addmm(inpass VARCHAR(10)) RETURNS VARCHAR(11)
BEGIN
DECLARE string_in VARCHAR(39);
DECLARE string_out VARCHAR(78);
DECLARE offset TINYINT(2);
DECLARE outpass VARCHAR(30) DEFAULT '';
DECLARE len TINYINT;
SET len = LENGTH(inpass);
IF (len <= 0 OR len > 10) THEN RETURN ''; END IF;
SET offset = (SECOND(NOW()) MOD 39) + 1;
SET string_out = 'YN8K1JOZVURB3MDETS5GPL27AXWIHQ94C6F0#$_';
SET string_in = '_$#ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
SET outpass = CONCAT(outpass, SUBSTRING(string_out, offset, 1));
SET string_out = CONCAT(string_out, string_out);
SET @i = 0;
REPEAT
SET @i = @i + 1;
SET outpass = CONCAT(outpass, SUBSTR(string_out, INSTR(string_in, SUBSTRING(inpass, @i, 1)) + offset, 1));
UNTIL (@i >= len) END REPEAT;
RETURN outpass;
END
CREATE PROCEDURE pro_addmm(IN inpass VARCHAR(10), OUT outpass VARCHAR(11))
BEGIN
DECLARE string_in VARCHAR(39);
DECLARE string_out VARCHAR(78);
DECLARE offset TINYINT(2);
DECLARE len TINYINT;
SET outpass = '';
SET len = LENGTH(inpass);
IF (len <= 0 OR len > 10) THEN SET outpass = '';
ELSE
SET offset = (SECOND(NOW()) MOD 39) + 1;
SET string_out = 'YN8K1JOZVURB3MDETS5GPL27AXWIHQ94C6F0#$_';
SET string_in = '_$#ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
SET outpass = CONCAT(outpass, SUBSTRING(string_out, offset, 1));
SET string_out = CONCAT(string_out, string_out);
SET @i = 0;
REPEAT
SET @i = @i + 1;
SET outpass = CONCAT(outpass, SUBSTR(string_out, INSTR(string_in, SUBSTRING(inpass, @i, 1)) + offset, 1));
UNTIL (@i >= len) END REPEAT;
END IF;
END
mysql> CALL pro_addmm('zhouys', @a); SELECT @a;
+---------+ | U_PI6$4 |
mysql> CALL pro_addmm('zhouys', @a); SELECT @a;
+---------+ | 9P8UEGM |
mysql> SELECT fun_submm('U_PI6$4'); -- 解密驗證
+----------------------+ | ZHOUYS |
有興趣可研究解密函數寫法。