#创建存储过程#参数格式#in输入参数 out输出参数 inout既可以输入也可以输出 createorreplaceprocedure'存储过程名称'(in|out|inout arg varchar(255))#begin和end表示sql代码的开始与结束begin#使用declare来声明变量declare age intdefault18;declare name varchar(255)default'雄狮';declare code int;declare num int;#使用set对定义的变量赋值set code =0;#使用运算符对变量进行合法运算,将结果赋值给变量`set 变量名 :=expression(表达式)`set age :=age+20;#控制结构if age >18thenselect'成年';elseselect'未成年';endif;#循环结构(while结构)while age >0doset age := age -1;endwhile;#循环结构(repeat结构)repeatset age := age -1;
until age <0endrepeat;#循环结构(for结构)#循环结构(loop结构)#case结构set num :=mod(age,2);case num
when1thenselect'我是奇数';when2thenselect'我是偶数';elseselect'I donot know';endcase;end
游标(作用范围存储过程)
#声明游标(定义游标选项、要查询的select语句)declare cursor_student cursorforselect id from student;#打开游标,使用游标数据(前面定义的select语句检索出来)open cursor_student;#从游标中取数据,获取第一行数据fetch cursor_student into result;#关闭游标close cursor_student;
事务(Demo)
#将结束符号 改成 ;; 结束DELIMITER;;#创建一个存储过程,名称是pre_affair ,输入变量是 in_user_name 字符串型 ,输出变量是out_rest 整形CREATEPROCEDURE`pre_affair`(IN in_user_name VARCHAR(255),OUT out_rest INT)BEGIN#定义一个循环变量i,类型是整形,默认是5DECLARE i INTDEFAULT5;#定义一个错误的变量,类型是整形,默认是0DECLARE t_error INTEGERDEFAULT0;#捕获到sql的错误,就设置t_error为1DECLARECONTINUEHANDLERFOR SQLEXCEPTION SET t_error=1;#开启事务STARTTRANSACTION;#删除id是5的这条数据DELETEFROM`user`WHERE id =5;#循环插入数据,这里是从 id是5插入到id是6为止#注意:这里user表的id是5的这条被删除了,因为id是主键,但是id是6的这条本身存在,如果这里插入id是6时,将会发生事务回滚,id是5的这条不会被删除WHILE i<7DO#插入一条数据进来INSERTINTO`user`(id,user_name)VALUES(i,in_user_name);#设置i每次循环加1SET i = i +1;ENDWHILE;#如果捕获到错误IF t_error=1THEN#回滚ROLLBACK;ELSE#提交COMMIT;ENDIF;#查看返回的结果,并给到输出的变量中SELECT t_error INTO out_rest;END;;#将结束符号 改成 ; 结束DELIMITER;
#创建存储过程CREATEDEFINER=`root`@`localhost`PROCEDURE`user_demo_one`(in arg1 VARCHAR(255),out arg2 VARCHAR(255))BEGINselect id into arg2 from student where create_by = arg1;END#调用存储过程call user_demo_one('小A',@arg2);select@arg2;#创建游标CREATEDEFINER=`root`@`localhost`PROCEDURE`user_demo_one`()BEGINdeclare result varchar(255);declare flag booleandefaultfalse;declare cursor_student cursorforselect id from student;#MySQL continue handlerDECLARECONTINUEHANDLERFOR SQLSTATE '02000'SET flag=true;#打开游标open cursor_student;repeat#获取第一行数据fetch cursor_student into result;
until flag
endrepeat;select result;close cursor_student;end