天天看点

Mysql 存储过程

1、理解:

        把若干条 SQL

语句封装起来,起个名字,就叫过程

把这个过程存储在数据库中,就叫存储过程

2、存储过程的创建语法:

create procedure procedureName()

begin

--sql 语句

end$

3、查看已有的存储过程:

        示例:show

procedure status;

4、调用存储过程:

        示例: call

procedureName ();

5、存储过程是可以编程的,意味着可以使用 变量 表达式 控制结构来完成复杂的功能

1、声明变量关键词:declare

         格式:

declare 变量名 变量类型  [default

默认值]

         实例:

create procedure

p2()

declare age int default

18;

declare height int default

180;

select concat(‘年龄‘,age,‘身高‘,height) from

dual;

2、变量运算和赋值:

        1、赋值: set 变量名 := 1

示例:create procedure

set age := age +

20;

select concat(‘20年后的年龄‘, age ,‘身高‘ , height) from

goods;

2、如何给存储过程传参数

解释:存储过程的括号里面,可以声明参数

语法:[in / out / inout] 参数名

参数类型

示例:

create procedure p5(width int, height

int)

select concat(‘你的面积是‘ , width * height) as

area;

if width > height

then

select

‘你很胖‘;

elseif width < height then

‘你很瘦‘;

else

‘你是方的‘;

end

if

3、控制结构:

1、顺序

2、分支/选择

1、case:

create procedure p6(in n

declare total int default

0;

set toral := floor(5 * rand()); 

#取整

case

total

when 1

then select

‘nihao‘;

when 2

then select 

‘hello‘;

‘hi‘;

case;

3、循环:

1、while:

declare  num int default

while num <

n

do

set num := num +

1;

set total := total +

num;

while;

total;

2、repeat:

循环

w()

declare w int default

declare e int default

repeat

set w := w +

set e := w +

e;

until w  >= 100  end

repeat;

e;                                                 

end;

    3、cursor

游标:

        1、解释:1条 SQL

,对应N条结果集资源,取出资源的接口/句柄,就是游标

取值:取出一次,向后进1格,当没数据时,报错 02000

2、构成:

1、声明:declare 游标名 cursor

select语句

2、打开:open

游标名

3、取值:fetch 游标名 into var

...;

4、关闭:close 游标名

3、游标取值越界时,有没有标识?利用标识来结束(触发)

1、:在 Mysql cursor 中,可以用 declare continue handler / declare exit handler

来操作一个标识符

语法:declare exit handler for NOT FOUND set  var := 

2、:continue 和 exit 和 undo

的区别:

1、exit         

:触发后,后面的语句不再执行

2、continue 

:触发后,后面的语句会继续执行

3、undo         

:触发后,前面的语句撤销(但是呢,Mysql 目前还不支持

undo)                

4、示例:

1、逻辑上不够严明,如果第一行就为空,会怎么样

q()

declare w int

;

declare q int

declare e varchar(20)

;           

declare var int default

declare getgoods cursor for select gid, num, name from

declare exit handler for NOT FOUND set var :=

#如果这里不是 exit 而是 continue ,那么最后一行会被多执行一次

open

getgoods;

fetch getgoods into w, q,

select w, q,

until var = 0 end

close

2、第2种,在逻辑上要正确一些:

declare getgoods cursor for select gid, num, name from goods

declare continue handler for NOT FOUND set var :=

while var = 1