mysql存储过程加mybatis使用入门

存储过程

存储过程是什么

就是sql语言的函数,函数内同时执行了多个sql语句,并且有变量之类的给你使用,也有if。。。else之类的逻辑控制,所以本质来说,既是一个函数。同样的作用的,其实还有一个叫做存储方法,这个其实才更加像函数。

存储过程怎么用
  1. mysql中定义存储过程:
DELIMITER $$
#这个DELIMITER $$的意思是,把sql语句的结束符号由分号";"变成了"$$",目的是为了下面这个函数中分号可以被自然的使用,而不会让sql解释器遇到分号就执行了。
CREATE PROCEDURE CountOrderByStatus4(
 IN orderStatus INT,
 OUT total INT)#这个你可以理解为是函数头,格式是:CREATE PROCEDURE 函数名(参数1,参数2。。)
BEGIN#这里的作用相当于我们java里的两个大括号中的{,用来确定生命周期范围的
#      到这一步,就是写你的逻辑代码了,我这里简单的演示一下if的使用:if (条件判断) then (执行的语句) end if结束;
 declare age tinyint default 0;#声明变量 age,和java不一样,类型是写在后面的,还有默认值是通过default进行赋值
 select count(VID) INTO total from schemetable where VID in (orderStatus);#每一次执行的selcet语句,都会有一个返回集,存在缓存中,这里体现的是存储过程就是一组sql语句的集合,所以每一个sql的查询结果自然是要展示的,但是,又因为sql语句有函数性质,所以还有两种方式进行返回结果out和return(后面会讲,先知道就好,这两个有点类似是C语言中的地址传递和函数的返回值)。
 IF total=1 then
		set total=2;#变量的赋值是通过set
	 end if;
END#这里的作用相当于我们java里的两个大括号中的},用来确定生命周期范围的
$$
DELIMITER ;

定义的方式如上,详解参上

  1. mysql中调用:
call 存储过程名(参数1,参数2.。)
  1. sql语言,关于存储过程的基础知识:
  • 定义参数:3类,外部传参(in,out),declare定义
  • 赋值:3类,set直接赋值,into在句子中赋值(只能一一对应的赋值),存储在中间临时表中
  • if逻辑判断
  • do。。while循环
  • 遍历多行结果集
例子
DROP procedure IF EXISTS `addToExercisetable`;#如果有了函数定义,就删了重新定义,这是为了之后执行方便
DELIMITER $$                   #前文有讲过的
CREATE PROCEDURE addToExercisetable(
 IN StID INT,
 OUT total INT)                              #函数头
BEGIN              
-- 中存值
DECLARE texts MEDIUMTEXT ;               #这个值是为了缓存多列结果集合中的一列
-- 遍历数据结束标志
DECLARE done INT DEFAULT FALSE;            #这一步是定义了一个结束标志,循环中用到的
-- 游标 for后面跟着需要遍历的结果集(一个查询也是)          #游标:相当于指针,这里是返回的结果集合(可以理解为数组)头地址给了它。用法如下,for(select语句)
DECLARE cur_account CURSOR FOR select PContent from problemtable where PID in(
	select pid from schemecontenttable where VID = (
		select vid from class_course_schemetable where CID=(
			select CID from class_studenttable where SID=StID and Status=1
		) and Enabled=1
	) and Enabled = 1
);
-- 将结束标志绑定到游标
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;


-- 打开游标
OPEN  cur_account;     
-- 遍历
read_loop: LOOP
        -- 取值 取多个字段
        FETCH  NEXT from cur_account INTO texts;
        IF done THEN
            LEAVE read_loop;
        END IF;
        -- 你自己想做的操作
        insert into atry(pcontent) value(texts);               #用CONCAT()好像也可以实现数组的遍历了,用CONCAT(数组名,index),不过有了游标,好像不用这个了
END LOOP;
END
$$
DELIMITER ;
call addToExercisetable(8,@total);
SELECT @total

这是一个更加复杂一点的例子,

参看

  1. https://www.cnblogs.com/rootq/archive/2009/05/27/1490523.html
  2. mybatis使用存储过程
  3. 一个手写数组遍历的sql语句的例子
  4. 游标的使用添加链接描述
发布了54 篇原创文章 · 获赞 10 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_42031483/article/details/104039213
今日推荐