码迷,mamicode.com
首页 > 数据库 > 详细

mysql---存储过程

时间:2014-06-22 16:39:46      阅读:295      评论:0      收藏:0      [点我收藏+]

标签:mysql   存储过程   

了解存储过程之前,先了解一下mysql的控制结构。

类似C语言(if……else、while循环等)SQL也有自己的控制结构。


if……else控制结构:

例如:

(1)

<span style="font-family:FangSong_GB2312;">if 判断表达式 
   then 执行语句;
end if;

与c语言进行比较
if(判断表达式)
   执行语句;</span>

(2)

<span style="font-family:FangSong_GB2312;">if 判断表达式1 
   then 执行语句1;
else
   then  执行语句2;
end if;

与c语言进行比较
if(判断表达式1)
   执行语句1;
else 
   执行语句2;</span>

(3)

<span style="font-family:FangSong_GB2312;">if 判断表达式1 
   then 执行语句1;
elseif 判断表达式2 
   then  执行语句2;
……
elseif 判断表达式N 
   then 执行语句N;
else
   执行语句N+1;
end if;

与c语言进行比较
if(判断表达式1)
   执行语句1;
else if(判断表达式2)
   执行语句2;
……
else if(判断表达式N)
   执行语句N;
else
   执行语句N+1;</span>

需要注意所有的执行语句和end if都要以‘;’结束,而且判断表达式之后接then,还有一点与C语言不同的是elseif之间没有空格。

mysql中还有一些与if相关的函数

if(判断表达式,值1,值2) 如果表达式为“true”返回“值1”,表达式为“false”返回“值2”。类似于C语言中的三目运算符。

ifnull(表达式1,表达式2)如果表达式1不为空,则返回表达式1。如果表达式1为空,则返回表达式2

nullif(表达式1,表达式2)如果表达式1=表达式2,返回null ,否则返回表达式1。


case when控制结构:

有两种形式

(1)

<span style="font-family:FangSong_GB2312;">case 待判断值 
when 值1 then 输出1
when 值2 then 输出2
……
when 值N then 输出N
else 默认输出 end;  #如果输出时语句的话,最后的结尾要改成end case。输出的是值则是end

同C语言的switch相比较
switch(待判断值){
case 值1:输出1
          break;
case 值2:输出2
          break;
……
case 值N:输出N
          break;
default:默认输出
}</span>

(2)

<span style="font-family:FangSong_GB2312;">case
when 判断表达式1 then 输出1
when 判断表达式2 then 输出2
……
when 判断表达式N then 输出N
else 默认输出 end case; #如果输出时语句的话,最后的结尾要是end case。输出的是值则是end。</span>

while循环结构:

<span style="font-family:FangSong_GB2312;">while 判断表达式 do
循环体
end while;

C语言中的while循环
while(判断表达式){
循环体;
}</span>

loop循环结构:无条件循环

<span style="font-family:FangSong_GB2312;">标签:loop
循环体;
end loop;
可以通过"leave 标签"来跳出loop循环。</span>

repeat循环结构:

<span style="font-family:FangSong_GB2312;">repeat
循环体; 
until 判断表达式 end repeat;</span>


现在开始介绍存储过程,其实存储过程跟函数很像

查看当前存储过程的状态:show procedure status;

创建存储过程:

<span style="font-family:FangSong_GB2312;">create procedure 名称(参数列表)
begin
语句集
end;</span>

参数列表总是存在的,如果没有参数则应该是空参数列表(),参数必须指定数据类型而且每个参数默认都是一个in参数。要指定为其他参数,可以在参数前面加上out或inout关键字。默认的in类似于按值传递,在存储过程中对参数进行修改,调用者是看不到的。out参数只是用来从存储过程传回数据的,无论给参数传入什么值,这个参数的初始值始终是null。对于inout参数,调用者不仅可以设置参数的初始值,而且在过程中修改参数,调用者是看得到的类似与按地址传递

删除存储过程:drop procedure 名称;

查看存储过程:show create procedure 名称\G 类似于show create table 表名  \G的作用是横向显示

调用存储过程:call 名称(参数);

声明变量:

(1)declare变量名 变量类型 默认值;    声明变量必须在开头定义,如果没有默认值,初始值为null。作用范围是在begin……end内

(2)set @变量名=初始值;定义的变量是用户变量,在存储过程之外的sql也是可以调用的

变量赋值:set 变量名=变量值  切忌直接给变量赋值(变量名= 变量值)

还有一种给一个或多个变量赋值的方法:利用“select 指定列 into 指定变量”,所以select的结果必须是单行。

 

示例:

所有示例,都实现将分界符设置为‘$‘

delimiter $

1、测试if-else控制结构

bubuko.com,布布扣


2、测试case……when

第一种情况:

输出是值,结尾用end。一般用于select

bubuko.com,布布扣

输出是语句,结尾用end case。一般用于存储过程

bubuko.com,布布扣

第二种情况:

输出是语句,结尾用end case。一般用于存储过程

bubuko.com,布布扣

输出是值,结尾用end。一般用于select

bubuko.com,布布扣

3、测试while循环

bubuko.com,布布扣


4、测试loop

bubuko.com,布布扣


5、测试repeat

bubuko.com,布布扣


6、带参数的存储过程

默认为in的参数:按值传递

bubuko.com,布布扣

初始值为0的变量tmp作为参数传入存储过程后,虽然在存储过程内对其进行修改,但调用者再次查看tmp时,值仍然为0,没有变化


out参数:

bubuko.com,布布扣

由第一个select可以看出,out参数不允许将实参的值传入存储过程。通过第二个和第三个select可以看出,存储过程内部修改变量后可以返回给调用者。

与按地址传递还有所不同,out只允许返回值,不允许传入值。


inout参数:按地址传递,形参值改变会改变实参的值

bubuko.com,布布扣

第一个select结果为0,说明实参的值传进存储过程。第二个和第三个select结果表明,inout可以在存储过程内部修改形参的值,从而影响实参,类似于按地址传递

mysql---存储过程,布布扣,bubuko.com

mysql---存储过程

标签:mysql   存储过程   

原文地址:http://blog.csdn.net/my_mao/article/details/32128149

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!