MySQL的Stored Function和Trigger
Stored Function
儲存Function可以作為運算式在內建方法可以調用的地方使用以及SELECT、UPDATE、DELETE、INSERT語句中使用
Java代碼
- CREATE FUNCTION function_name(parameter[,...])
- RETURNS datatype
- [LANGUAGE SQL]
- [ [NOT] DETERMINISTIC]
- [ {CONTAINS SQL | NO SQL | MODIFIES SQL DATA | READS SQL DATA} ]
- [ SQL SECURITY {DEFINER|INVOKER} ]
- [COMMENT comment_string ]
- function_statements
CREATE FUNCTION function_name(parameter[,...]) RETURNS datatype [LANGUAGE SQL] [ [NOT] DETERMINISTIC] [ {CONTAINS SQL | NO SQL | MODIFIES SQL DATA | READS SQL DATA} ] [ SQL SECURITY {DEFINER|INVOKER} ] [COMMENT comment_string ] function_statements
三點與預存程序不同的地方:
1,必須要一個RETURNS語句來定義傳回值類型
2,不能指定參數的IN、OUT或INOUT修飾符,所有參數隱式的為IN
3,Function體必須包含RETURN語句來終結Function執行並返回指定的結果給調用者
Example:
Java代碼
- CREATE FUNCTION cus_status(in_status CHAR(1))
- RETURNS VARCHAR(20)
- BEGIN
- DECLARE long_status VARCHAR(20);
-
- IF in_status = 'O' THEN
- SET long_status='Overdue';
- ELSEIF in_status = 'U' THEN
- SET long_status='Up to date';
- ELSEIF in_status = 'N' THEN
- SET long_status='New';
- END IF;
-
- RETURN(long_status);
- END;
CREATE FUNCTION cus_status(in_status CHAR(1)) RETURNS VARCHAR(20)BEGIN DECLARE long_status VARCHAR(20); IF in_status = 'O' THEN SET long_status='Overdue'; ELSEIF in_status = 'U' THEN SET long_status='Up to date'; ELSEIF in_status = 'N' THEN SET long_status='New'; END IF; RETURN(long_status);END;
好像MySQL當前最新版本(5.1)還不支援嵌套的Stored Function,僅支援嵌套的Stored Procedure
Trigger
Trigger是資料庫中的事件觸發,當前MySQL的實現是對特定table的DML語句(INSERT/UPDATE/DELETE)調用時觸發
Java代碼
- CREATE [DEFINER={user|CURRENT_USER}] TRIGGER trigger_name
- {BEFORE|AFTER}
- {INSERT|UPDATE|DELETE}
- ON table_name
- FOR EACH ROW
- trigger_statements
CREATE [DEFINER={user|CURRENT_USER}] TRIGGER trigger_name {BEFORE|AFTER} {INSERT|UPDATE|DELETE}ON table_nameFOR EACH ROWtrigger_statements
AFTER類型的Trigger不能修改NEW記錄的值
如果同時對大量的行做操作,Trigger可能效能開銷較大,所以盡量避免在Trigger裡放入效能消耗大的SQL語句
Example: Using trigger to implememt audit logging
Java代碼
- CREATE TRIGGER account_balance_au
- AFTER UPDATE ON account_balance FOR EACH ROW
- BEGIN
- INSERT into transaction_log
- (user_id, description)
- VALUES(user(),
- CONCAT('Adjusted account ',
- NEW.account_id, ' from ', OLD.balance,
- ' to ', NEW.balance));
- END;