最近很多烦恼,都来自于存储过程.
做了两年数据库管理,但是其实不会写过程...
现在突然要搞,心里非常抵触,也没有把握.
不过我看了下面的文章,发现原来这貌似也不难...
参考:
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/ ,如需转载,请注明出处,否则将追究法律责任。