Chinaunix首页 | 论坛 | 博客
  • 博客访问: 607077
  • 博文数量: 129
  • 博客积分: 8026
  • 博客等级: 中将
  • 技术积分: 1300
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-21 14:39
文章分类

全部博文(129)

文章存档

2011年(1)

2007年(26)

2006年(102)

我的朋友

分类:

2006-08-08 23:00:24

存储过程创建语法:

CREATE PROCEDURE procedure_name ([parameter[,...])

[LANGUAGE SQL]

[ [NOT] DETERMINISTIC ]

[{CONTAINS SQL|MODIFIES SQL DATA|READS SQL DATA|NO SQL}]

[SQL SECURITY {DEFINER|INVOKER} ]

[COMMENT comment_string]

procedure_statements


 
可用SHOW PROCEDURE STATUS 或 SHOW CREATE PROCEDURE 来查看存储过程信息
另,系统表INFORMATION_SCHEMA.ROUTINES也包含了存储过程的一些信息
同样地,函数也可以使用同样方式查看(SHOW FUNCTION STATUS)


函数的创建
 

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 ]

语句体


函数与存储过程基本一样,其区别主要有:
1、  要使用RETURNS指定返回类型
2、  函数必须返回值,且在语句体中使用RETURN返回(注意:指定返回类型用RETURNS,返回值用RETURN)
3、  参数不区分IN,OUT,全部为IN类形


例:
CREATE FUNCTION cust_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;
 
调用:
SELECT cust_status('O');
 
触发器
 

CREATE [DEFINER={user|CURRENT_USER}] TRIGGER trigger_name

{BEFORE|AFTER} {UPDATE|INSERT|DELETE}

ON table_name

FOR EACH ROW

trigger_statements


 
意义:当对表table_name执行update,insert,delete操作之前(before)或之后(after)时触发语句trigger_statements操作

例:
mysql> CREATE TRIGGER account_balance_au
 AFTER UPDATE ON account_balance FOR EACH ROW
BEGIN
  DECLARE dummy INT;
  IF NEW.balance<0 THEN
     SET NEW.balance=NULL;
  END IF;
END
 
上述触发器表示:当更新表account_balance之后,如果更新的值balance小于0,则将它改为NULL,
注:如果为OLD.balance则表示更新前的原值

阅读(2645) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~