一:概念:
存储过程实际上对标了JAVA当中的方法,两者是相似的,同时需要注意的一点是,MYSQL仅仅在5.0版本之后才出现这种存储操作的过程;
优点:
1.存储过程能够让运行的速度变得更加迅速,仅仅只有首次进行实用的时候需要进行相应的编译,之后再次调用的时候可以直接进行实用
2.存储过程的特点:模块化,代码复用,封装。
二:分类
1.存储过程关键语句
2.变量
3.参数传递
4.分支语句
5.循环语句
6.游标
7.异常处理handler
1.存储过程关键语句:
delimiter (设置启动的标识符); create procedure (存储过程的名称) (参数传递关键词 参数名称 参数类型); begin (检索代码) end (开始设置的标识符); delimiter ;
2.变量:
1>变量类型:
①:局部变量
②:用户变量
③:参数变量
2>变量介绍:
①:局部变量
范围:顾名思义,局部变量的作用范围比较的小,仅仅只能够作用在存储过程当中的begin--end之间进行实用,一旦超出范围进行调用,检索的时候就无法进行搜索:
关键语句:
delimiter ..; create procedure ...() begin declare (局部变量名称) 局部变量的类型 [default ....(初始化)]; -- 开始对于局部变量进行赋值 set (局部变量名称) = ...; (其他检索) end ...; delimiter ; select (局部变量名称); -- 不成功,因为在存储过程begin-end之外运行
②用户变量:
范围:用户变量的作用范围有所增大,可以作用于当前的会话,也就是作用在当前互联网跟mysql的连接ing
关键语句:
TIPS: -- 1.需要注意的一点是,对于所有的用户变量,都不需要进行声明,赋值即声明 -- 2.对于所有的用户变量,都能够在存储过程的外面进行调用 delimiter ...; create procedure ...() begin set (用户变量名称) = ; end ...; delimiter ; select (用户变量名称); -- 可以搜索到相应的结果
③参数变量:
参数变量又可以分为两个部分,一个是全局变量,一个是会话变量
1.全局变量:
1>范围:
对于全局变量的修改会影响到一整个的服务器,并且对于全局变量来说,在MYSQL启动的时候由服务器自动对他们进行默认初始化,这些默认值可以通过my.in这个文件进行修改
2>关键语句:
关键使用语句:global 1.查看全局变量: select global variables(全局变量名称); 2.查看具体的全局变量 show global@@.(相应的全局变量名称); 3.修改全局变量的值 set global (全局变量名称) = new_value;
2.会话变量:
1>作用范围:
对于会话变量,会在每一次建立新的连接的时候,MYSQL会对其进行初始化,将全局变量的值赋值一份用来当作当前新建会话的会话变量
2>关键语句:
1.查看局部变量 select session variables; 2.查看具体的局部变量 select @session.(局部变量名称); 3.修改局部变量的值 set session (局部变量名称) =new_value;
TIPS: 其实两个变量大体上是一样的,仅仅只有在作用范围上不同,其他的都是一样。因此,如果两个变量都没有修改,那么全局变量跟用户变量的值是一样的,两者并没有区别;
三.参数传递:
1.类型:参数传递主要分为三个,包括有三个部分分别是in,out,inout
2.介绍:
操作:
in:让数据能够进入到存储过程当中进行查询 delimiter \\; create procedure emp_1(in name varchar(20)) begin select * from emp e where e.name=name; -- 第二个name代表的是传入的参数的名称 end \\; delimiter ; out:能够让参数进行返回使用 delimiter \\; create procedure emp_2(in name varchar(20),out id int) begin select e.id into id from emp e where e.name=name; -- 第二个name代表的是传入的参数的名称 end \\; delimiter ; call emp_2(‘刘一’,@id); select @id; inout:能够对于输入的值进行修改,之后再进行返回 delimiter \\; create procedure emp_3(inout name varchar(20)) begin select * from emp e where e.name=name; -- 第二个name代表的是传入的参数的名称 end \\; delimiter ; set name='王老师'; call emp_3(name);
四:分支语句
1.分类:
分支语句主要包括有几个部分,if分支,case分支
2.
①:if分支
关键语句: if (条件) then 查询; elseif (条件...) then 查询: else default(设置除了这些之外的其他操作会有什么结果) endif; delimiter \\; create procedure pro-1(in single int) begin if single=1 -- 如果输入数字为1那么就显示所有的员工信息; then select * from emp; eles select '错误选项'; endif; end \\; delimiter ; 有关if的其他小知识: leava 表示直接离开当前的条件判断 -- 相当于JAVA当中的break; iterate 表示的是跳过当前的判断 -- 类似于在java当中的continue;
②case分支:
类似于JAVA当中的switch语句 语法一: case case_value(变量名称) when when_value then select语句 when when_value then select语句 [else default] end case; 语法二: case when search_condition then select... when search_condition then select... [else default] end case;
五:循环语句:
循环语句主要可以分为三大类:while , loop ,repeat
循环是一种虽然只会程序当中出现一次,但是能够运行多次的代码
1.while
while循环类似于JAVA当中的while的循环,都是先判断条件,判断正确之后,可以再执行之后的语句,否则结束循环 语句: while(condition_value) do 循环体 end while; 加入到存储过程当中: 一:在表格当中插入数据,并且为自己控制插入多少条,设置use1存储过程 create table emp1( id int primary key, name varchar(20), user varchar(20) ); delimiter \\; create procedure use1(in single int) begin declare i int default 1; while(i<=single) do insert into emp1 values(i,concat('user',i),'123456'); set i = i+1; end while; 二:在表格当中插入single_0条数据,但是跳过第single_1条数据,设置use2存储过程 delimiter \\; create procedure use2(in single_0 int,in single_1 int) begin decalre i int default 1; w while(i<=single_0) do a if(i = single_1) then set i = i+1; iterate a; else insert into emp values(i,concat('user',i),'123456'); set i = i+1; end if; end while; end \\; delimiter ;
2.repeat循环语句
repeat循环相当于之前在java当中所学习的do-while循环,需要先执行查找语句,之后再进行判断条件 语句: [标签] repeat 循环体; utile when_value; end repeat[标签];
3.loop循环
loop循环不需要条件的判断,能够一直进行执行,所以,如果需要跳过循环,那么就需要使用相应的if条件判断,从而跳出这个死循环 -- 对应了java当中的while(true)循环 语法: [循环标签] loop 循环体: if when_value then.... elseif when_value then... ...leave [循环标签];... end if; end loop;
六.游标
1.介绍
游标是一种能够存储查询结果集的数据类型,在存储过程当中可以使用光标对结果进行一定的循环处理
2.使用
光标的使用包括:光标的声明,光标的打开,数值的获取,光标的关闭
1-- 声明: declare 游标名称 cursor for select_statement -- 打开语法 open 游标名称 -- 取值语法 fetch 游标名称 into decl_name..... -- 关闭语法 close 游标名称;
七.handler异常处理
1.介绍:
在MYSQL当中,针对一些错误机制进行处理的方法,通过HANDLER的使用,能够在MYSQL查询的过程当中避免一些错误类型的出现;
2.语法:
handler 异常处理 声明:declare (handler_action handler) for (condition_value) statement; handler_action:主要包括有三大部分 1.contitue 在错误出现之后继续之后的查询 2.exit 在错误出现之后不再进行之后的查询,直接结束所有的查询 3.UNDO不建议 condition_value主要包括以下的几个部分 mysql_error_code condition_name SQLWARNING NOT FOUND 未查询到相应的数据 SQLEXCEPTION SQL查询错误 同时的,如果需要使用handler句柄进行异常处理,首先需要考虑: 1.如果发现错误了,之后需要进行什么操作(condition_value) 2.这种错误是什么样的错误类型condition_value TIPS:需要注意的一点,对于各种声明,顺序是,变量声明,游标声明,handler声明的顺序