2008-05-27
MySQL的Stored Function和Trigger
关键字: mysql function trigger
MySQL的Stored Function和Trigger
Stored Function
存储Function可以作为表达式在内建方法可以调用的地方使用以及SELECT、UPDATE、DELETE、INSERT语句中使用
三点与存储过程不同的地方:
1,必须要一个RETURNS语句来定义返回值类型
2,不能指定参数的IN、OUT或INOUT修饰符,所有参数隐式的为IN
3,Function体必须包含RETURN语句来终结Function执行并返回指定的结果给调用者
Example:
好像MySQL当前最新版本(5.1)还不支持嵌套的Stored Function,仅支持嵌套的Stored Procedure
Trigger
Trigger是数据库中的事件触发,当前MySQL的实现是对特定table的DML语句(INSERT/UPDATE/DELETE)调用时触发
AFTER类型的Trigger不能修改NEW记录的值
如果同时对大量的行做操作,Trigger可能性能开销较大,所以尽量避免在Trigger里放入性能消耗大的SQL语句
Example: Using trigger to implememt audit logging
Stored Function
存储Function可以作为表达式在内建方法可以调用的地方使用以及SELECT、UPDATE、DELETE、INSERT语句中使用
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:
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)调用时触发
CREATE [DEFINER={user|CURRENT_USER}] TRIGGER trigger_name
{BEFORE|AFTER}
{INSERT|UPDATE|DELETE}
ON table_name
FOR EACH ROW
trigger_statements
AFTER类型的Trigger不能修改NEW记录的值
如果同时对大量的行做操作,Trigger可能性能开销较大,所以尽量避免在Trigger里放入性能消耗大的SQL语句
Example: Using trigger to implememt audit logging
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;
发表评论
- 浏览: 681918 次
- 性别:

- 来自: BJ

- 详细资料
搜索本博客
我的相册
screenshot
共 1 张
共 1 张
最近加入圈子
最新评论
-
Mnesia用户手册:三,构建 ...
要想创建disc_copies和disc_only_copies类型的表有两个前 ...
-- by hideto -
翻译www.djangobook.com之 ...
有个问题问一下: 我先配置了一个urlpatterns是这样的: r'^myd ...
-- by lyhapple -
Why OO sucks
gigix 写道lyl0035 写道为啥就没人想想,其实在面向对象的代码中也流露 ...
-- by hurd -
Why OO sucks
貌似又回到当年java vs c的年代。两种方式,不管是OO还是FP,仅是人处理 ...
-- by python -
大家可以抛弃Java踹死Djan ...
to phoenixup:1,你还别说,你举的什么Struts,Tapestry ...
-- by hideto






评论排行榜