ITPub博客

首页 > 数据库 > MySQL > MySQL存储过程

MySQL存储过程

MySQL 作者:壹頁書 时间:2016-06-14 21:56:56 0 删除 编辑

最近很多烦恼,都来自于存储过程.
做了两年数据库管理,但是其实不会写过程...
现在突然要搞,心里非常抵触,也没有把握.

不过我看了下面的文章,发现原来这貌似也不难...

参考:
http://blog.webfsd.com/article-31.html



查看已有存储过程
show procedure status \G

调用存储过程
call procedureName();

删除存储过程
drop procedure if exists procedureName;

存储过程的创建语法
delimiter #
create procedure procedureName()
begin
    sql语句
end#
delimiter ;

变量
变量定义
使用 declare 关键字。
DECLARE 仅被用在BEGIN ... END复合语句里,并且必须在复合语句的开头,在任何其它语句之前。
DECLARE variable_name [,variable_name...] datatype [DEFAULT value];
其中,datatype 为MySQL的数据类型,如:int, float, date, varchar(length)。

例如:
DECLARE l_int int unsigned default 4000000;
DECLARE l_numeric number(8,2) DEFAULT 9.95;
DECLARE l_date date DEFAULT '1999-12-31';
DECLARE l_datetime datetime DEFAULT '1999-12-31 23:59:59';
DECLARE l_varchar varchar(255) DEFAULT 'This will not be padded';

delimiter #
create procedure procedure1()
begin
    declare age int default 18; -- 声明变量
    declare height int default 180; -- 声明变量
    select concat('年龄是',age ,',身高是:',height);
end #

变量赋值
SET 变量名 := 表达式值 [,variable_name = expression ...]

变量运算
delimiter #
create procedure p2()
begin
    declare age int default 18; -- 声明变量
    declare height int default 180; -- 声明变量
    set age := age + 20; -- 变量运算
    select concat('20年后的年龄是',age ,',身高是:',height);
end #

用户变量
在MySQL客户端使用用户变量
SELECT 'Hello World' into @x; -- 赋值
SELECT @x;
SET @y='Goodbye Cruel World'; -- 赋值
SELECT @y;

在存储过程中使用用户变量
delimiter #
CREATE PROCEDURE GreetWorld() begin SELECT CONCAT(@greeting,' World'); end #
SET @greeting='Hello' #
CALL GreetWorld() # -- 'Hello World'
注意:
①用户变量名一般以@开头
②滥用用户变量会导致程序难以理解及管理

MySQL存储过程的控制结构

选择
if语句
语法:
IF search_condition THEN statement_list
    [ELSEIF search_condition THEN statement_list] ...
    [ELSE statement_list]
END IF
实例:

create procedure p3()
begin 
    declare age int default 18; -- 声明变量
    declare height int default 180; -- 声明变量
    if age >= 18 then
        select '已成年';
    else 
        select '未成年';
    end if;
end #


case语句
语法:
CASE case_value
    WHEN when_value THEN statement_list
    [WHEN when_value THEN statement_list] ...
    [ELSE statement_list]
END CASE;
Or: 
CASE
    WHEN search_condition THEN statement_list
    [WHEN search_condition THEN statement_list] ...
    [ELSE statement_list]
END CASE;
示例:
delimiter $
create procedure p7()
begin
    declare pos int default 0;
    set pos := 4*rand();
    case pos
        when 1 then select 'one';
        when 2 then select 'two';
        when 3 then select 'three';
        else select "i don't know";
    end case;
end$


循环
while语句
语法:
[begin_label:] WHILE search_condition DO
    statement_list
END WHILE [end_label]
示例: 计算1+2+3+...+100的值。

delimiter $
create procedure p4()
begin
    declare total int default 0;
    declare num int default 0;
    while num < 100 do
        set num := num + 1;
        set total := total + num;
    end while;
    select total; -- 5050
end$

传递参数更灵活地求和。
delimiter $
create procedure p4(in n int)
begin
    declare total int default 0;
    declare num int default 0;
    while num < n do
        set num := num + 1;
        set total := total + num;
    end while;
    select total;
end$
call p4(100)$ --- 5050


repeat循环结构
语法:
[begin_label:] REPEAT
    statement_list
UNTIL search_condition
END REPEAT [end_label]
示例: 求和1+2+3+...+100的值。
delimiter $
create procedure p5(in n int)
begin
    declare totle int default 0;
    declare i int default 0;
    repeat 
        set i := i+1 ;
        set totle := totle + i;
    until i >= n end repeat;
    select totle;
end$
call p5(100)$ -- 5050



存储过程传参
存储过程的括号里,可以声明参数。
in :给参数传入值,定义的参数就得到了值
out:模式定义的参数只能在过程体内部赋值,表示该参数可以将某个值传递回调用他的过程(在存储过程内部,该参数初始值为 null,无论调用者是否给存储过程参数设置值)
inout:调用者还可以通过 inout 参数传递值给存储过程,也可以从存储过程内部传值给调用者

如果仅仅想把数据传给 MySQL 存储过程,那就使用 in 类型参数; 如果仅仅从 MySQL 存储过程返回值,那就使用 out 类型参数; 如果需要把数据传给 MySQL 存储过程,还要经过一些计算后再传回给我们,此时,要使用 inout 类型参数。 MySQL 存储过程参数如果不显式指定 in 、 out 、 inout ,则默认为 in 。

传参语法
create procedure 存储过程名([in/out/inout] 参数名 参数类型 ..)
存储过程传参之in

使用存储过程求和
DELIMITER $$
CREATE PROCEDURE p1(IN num INT)
BEGIN
  DECLARE i INT DEFAULT 0;
  DECLARE total INT DEFAULT 0;
  WHILE i<=num DO
    SET total := i + total;
    SET i := i+1;
  END WHILE;
  SELECT total;
END$$
call(100)$$  -- 5050

存储过程传参之out
CREATE PROCEDURE p2(OUT num INT)
BEGIN
 SELECT num AS num_1;
 IF (num IS NOT NULL) THEN
     SET num = num + 1;
     SELECT num AS num_2;
 ELSE
     SELECT 1 INTO num;
 END IF;
     SELECT num AS num_3;
END$$
SET @num = 10$$ -- 设置用户变量
CALL p2(@num)$$
SELECT @num AS num_out$$ -- 1


存储过程传参之inout
CREATE PROCEDURE p3(INOUT age INT)
BEGIN
  SET age := age + 20;
END$$
set @currage =18$$ -- 设置用户变量
call p3(@currage)$$
select @currage$$ -- 38

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29254281/viewspace-2120155/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2013-10-19

  • 博文量
    620
  • 访问量
    6339945