存储过程
存储过程是什么
就是sql语言的函数,函数内同时执行了多个sql语句,并且有变量之类的给你使用,也有if。。。else之类的逻辑控制,所以本质来说,既是一个函数。同样的作用的,其实还有一个叫做存储方法,这个其实才更加像函数。
存储过程怎么用
- 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 ;
定义的方式如上,详解参上
- mysql中调用:
call 存储过程名(参数1,参数2.。)
- 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
这是一个更加复杂一点的例子,
参看
- https://www.cnblogs.com/rootq/archive/2009/05/27/1490523.html
- mybatis使用存储过程
- 一个手写数组遍历的sql语句的例子
- 游标的使用添加链接描述