MySQL的Stored Function的调用

http://www.cnblogs.com/cy163/archive/2008/10/15/1311988.html

MySQL的Stored Function和Trigger

Stored Function
存储Function可以作为表达式在内建方法可以调用的地方使用以及SELECT、UPDATE、DELETE、INSERT语句中使用

Java代码 复制代码
  1. CREATE FUNCTION function_name(parameter[,...])   
  2.     RETURNS datatype   
  3.     [LANGUAGE SQL]   
  4.     [ [NOT] DETERMINISTIC]   
  5.     [ {CONTAINS SQL | NO SQL | MODIFIES SQL DATA | READS SQL DATA} ]   
  6.     [ SQL SECURITY {DEFINER|INVOKER} ]   
  7.     [COMMENT comment_string ]   
  8.     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代码 复制代码
  1. CREATE FUNCTION cus_status(in_status CHAR( 1 ))   
  2.     RETURNS VARCHAR(20 )   
  3. BEGIN   
  4.     DECLARE long_status VARCHAR(20 );   
  5.   
  6.     IF in_status = 'O'  THEN   
  7.         SET long_status='Overdue' ;   
  8.     ELSEIF in_status = 'U'  THEN   
  9.         SET long_status='Up to date' ;   
  10.     ELSEIF in_status = 'N'  THEN   
  11.         SET long_status='New' ;   
  12.     END IF;   
  13.   
  14.     RETURN(long_status);   
  15. 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代码 复制代码
  1. CREATE [DEFINER={user|CURRENT_USER}] TRIGGER trigger_name   
  2.   {BEFORE|AFTER}   
  3.   {INSERT|UPDATE|DELETE}   
  4. ON table_name   
  5. FOR EACH ROW   
  6. trigger_statements  
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

Java代码 复制代码
  1. CREATE TRIGGER account_balance_au   
  2.     AFTER UPDATE ON account_balance FOR EACH ROW   
  3.     BEGIN   
  4.         INSERT into transaction_log   
  5.             (user_id, description)   
  6.             VALUES(user(),   
  7.                 CONCAT('Adjusted account ' ,   
  8.                     NEW.account_id, ' from ' , OLD.balance,   
  9.                         ' to ' , NEW.balance));   
  10. END;  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值