Mysql存储过程基本语法

目录

  • 存储过程
    • MYSQL
      • 基础语法
      • 游标(作用范围存储过程)
      • 事务(Demo)
      • 其他操作
      • Demo

存储过程

MYSQL

基础语法

#创建存储过程
#参数格式
#in输入参数  out输出参数 inout既可以输入也可以输出  
create or replace procedure '存储过程名称'(in | out | inout arg varchar(255))

#begin和end表示sql代码的开始与结束
begin
	#使用declare来声明变量
	declare age int default 18;
	declare name varchar(255) default '雄狮';
	declare code int;
	declare num int;
	
	#使用set对定义的变量赋值
	set code = 0;
	
	#使用运算符对变量进行合法运算,将结果赋值给变量`set 变量名 :=expression(表达式)`
	set age :=age+20;
	
	#控制结构
	if age > 18 then
		select '成年';
    else
    	select '未成年';
    end if;
    
    #循环结构(while结构)
    while age > 0 do
    	set age := age - 1;
   	end while;
   	
   	#循环结构(repeat结构)
   	repeat
   	set age := age - 1;
   	until age < 0
   	end repeat;
   	
   	#循环结构(for结构)
   	
   	#循环结构(loop结构)
   	
   	#case结构
   	set num := mod(age,2);
   	case num
   	when 1 then select '我是奇数';
   	when 2 then select '我是偶数';
   	else select 'I donot know';
   	end case;
end

游标(作用范围存储过程)

#声明游标(定义游标选项、要查询的select语句)
declare cursor_student cursor for select id from student;
#打开游标,使用游标数据(前面定义的select语句检索出来)
open cursor_student;
#从游标中取数据,获取第一行数据
fetch cursor_student into result;
#关闭游标
close cursor_student;

事务(Demo)

#将结束符号 改成 ;; 结束
DELIMITER ;;
#创建一个存储过程,名称是pre_affair ,输入变量是 in_user_name 字符串型 ,输出变量是out_rest 整形
CREATE PROCEDURE `pre_affair`(IN in_user_name VARCHAR(255), OUT out_rest INT)
BEGIN
    #定义一个循环变量i,类型是整形,默认是5
    DECLARE i INT DEFAULT 5;
    #定义一个错误的变量,类型是整形,默认是0
    DECLARE t_error INTEGER DEFAULT 0;
    #捕获到sql的错误,就设置t_error为1
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;
    #开启事务
    START TRANSACTION;

    #删除id是5的这条数据
    DELETE FROM `user` WHERE id = 5;
    #循环插入数据,这里是从 id是5插入到id是6为止
    #注意:这里user表的id是5的这条被删除了,因为id是主键,但是id是6的这条本身存在,如果这里插入id是6时,将会发生事务回滚,id是5的这条不会被删除
    WHILE i<7 DO
        #插入一条数据进来
        INSERT INTO `user`(id,user_name)VALUES(i,in_user_name);
        #设置i每次循环加1
        SET i = i + 1;
    END WHILE;

    #如果捕获到错误
    IF t_error=1 THEN
        #回滚
        ROLLBACK;
    ELSE
        #提交
        COMMIT;
    END IF;
    #查看返回的结果,并给到输出的变量中
    SELECT t_error INTO out_rest;
END
;;
#将结束符号 改成 ; 结束
DELIMITER ;

其他操作

#删除存储过程(注意:不能在一个存储过程中删除另一个存储过程)
drop procedure '存储过程名称'

#区块
begin
	#sql语句
end;
#区块别名
lable:begin
	#sql语句
end lable;
#跳出区块,执行区块之后的代码
leave lable;

#显示数据库中所有存储的存储过程基本信息
show procedure status;

#显示某一个存储过程的详细信息
show create procedure '存储过程名称';

#修改mysql默认结束符,将默认结束符';' 改为 '$$'
#目的就是为了防止mysql解释器在我们编写存储过程时就执行sql,mysql解释器认为';'号就是sql结束符
DELIMITER $$

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET flag=true;
#MySQL continue handler 是一种用于处理游标的异常情况的方法。当使用游标进行数据遍历时,如果产生了异常,比如数据没有找到或者游标已经到达了末尾,continue handler 可以帮助我们捕获这些异常并执行相应的操作

Demo

#创建存储过程
CREATE DEFINER=`root`@`localhost` PROCEDURE `user_demo_one`(in arg1 VARCHAR(255),out arg2 VARCHAR(255))
BEGIN
  select id into arg2 from student where create_by = arg1;
END

#调用存储过程
call user_demo_one('小A',@arg2);
select @arg2;

#创建游标
CREATE DEFINER=`root`@`localhost` PROCEDURE `user_demo_one`()
BEGIN
	declare result varchar(255);
	declare flag boolean default false;
  	declare cursor_student cursor for select id from student;
	#MySQL continue handler
	DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET flag=true;
	
	#打开游标
	open cursor_student;
	repeat 
		#获取第一行数据
		fetch cursor_student into result;
	until flag 
	end repeat;
	select result;
	close cursor_student;
end

你可能感兴趣的:(mysql,mysql,数据库,存储过程,游标)