为什么要使用存储过程和触发器
1.存储过程
更快的速度。
避免代码冗余。
提高数据库的安全性。
2.触发器
在程序被定义的时候,用mysql客户端delimiter命令来把语句界面从
; 变为 //。
Delimiter //
3.命令的封装
由一条以上的sql 命令构成的函数或过程必须以关键字begin 开头、以关键字end结束。
4.全局变量和局部变量
全局性的普通sql变量:这类变量的名字前面都有一个“@”字符作为前缀。
存储过程的局部变量:这些变量的名字前面没有“@”字符,必须在使用它们之前用declare命令对它们做出声明。
5.声明(declare)
变量的声明必须发生在begin – end 语句块里。
Declare varname datatype [ default value ]
6.对变量赋值
sql语言不允许以x=x+1 的形式对变量赋值,必须使用set 或 select into 命令来做这件事。
Create procedure 存储过程名()
Begin
Declare aa int;
Set aa=1;
Select aa;
End
7.分支
If -- then -- else -- end if分支
8.循环
Repeat -- until 循环
While 循环
[ Loopname :] while condition do
Commands;
End while [ loopname ]
loop 循环
loopname :loop
commands;
end loop loopname;
在这种循环结构里,关键字loop和end loop 之间的语句将一直循环执行到遇见一条leave loopname 命令并因此而退出整个循环为止。
Create procedure aa()
Begin
Declare I int default 0;
Myloop:loop
Set I = i+1;
Select I;
If I >=10 then leave myloop;
End if;
End loop myloop;
End
9.出错处理
存储过程里的sql命令在执行过程中可能会出错,所以sql也像其它一些程序设计语言那样向程序员提供了一种利用出错处理句柄(error handler ,也有人称为“出错处理器”来响应和处理这类错误的机制。
语法:
Declare type handler for condition1,condition2,condition3 command
注:
Type(类型):可供选择的类型目前只有continue 和 exit 两种。Continue的含义是:如果当前命令在执行时发生错误,从下一条命令继续执行。
Exit 的含义是:如果有执行出错,则退出当前begin – end 语句块并从该语句块之后的第一条命令继续执行。
Condition(条件):出错处理条件可以用以下几种方式给出:
Sqlstate ‘errorcode’:单个sql出错代码,它的编号是errorcode。
Sqlwarning:涵盖了sqlstate编号为01nnn的所有错误。
Not found :涵盖了所有其他的(即sqlstate 编号不以01或02开头的)错误。
Command(命令):执行出错时将要执行的命令。因为这里只允许放上一条命令,所以它通常是一个变量赋值命令,该变量将在后续的出错处理代码中使用。
一.创建、编辑和删除sp
1.创建存储过程
Create procedure p_name[参数名称 数据类型及精度]
Begin
Select * Into 参数名称 from 表名;
End
//
调用call 存储过程名( )
查看Select
2.编辑存储过程
Alter procedure/function name
3.删除存储过程
Drop function f_name
Drop procedure p_name
4.查看存储过程
Show procedure status
Show function status
5.查看存储过程代码
Show create procedure
二.光标
声明光标
Declare 光标名 cursor for select 语句
打开光标
Open 光标名
提取
Fetch 光标名 into 变量
关闭光标
Close 光标名
实例:
Create procedure aa(out a int)
Begin
Declare c_jiang cursor for select * from jiang;
Open c_jiang;
Myloop:loop
Fetch c_jiang into a;
Select a;
End loop myloop;
Close c_jiang;
End