MySQL 存储过程学习笔记

来源:互联网 发布:淘宝发布产品教程 编辑:程序博客网 时间:2024/05/17 09:46

存储过程创建语法:

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 

 

函数的创建

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');

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

触发器

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则表示更新前的原值

基本语法

一.创建存储过程

1.基本语法:
create procedure sp_name()
begin
.........
end
2.参数传递

二.调用存储过程

1.基本语法:call sp_name()
注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递

三.删除存储过程

1.基本语法:
drop procedure sp_name//
2.注意事项
(1)不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

四.区块,条件,循环

1.区块定义,常用
begin
......
end;
也可以给区块起别名,如:
lable:begin
...........
end lable;
可以用leave lable;跳出区块,执行区块以后的代码
2.条件语句
if 条件 then
statement
else
statement
end if;

3.循环语句
(1).while循环
[label:] WHILE expression DO

statements

END WHILE [label] ;

(2).loop循环
[label:] LOOP

statements

END LOOP [label];

(3).repeat until循环
[label:] REPEAT

statements

UNTIL expression

END REPEAT [label] ;