循环语句
(3)while语句
基本结构:
begin while([执行条件]) do ...... end while; end;
新建一个Sscore列:
alter table student add Sscore int;
随机从1~100分插入成绩,输入参数i 作为需要修改成绩的人数,使用while循环一行行修改成绩
drop procedure add_math_score(); delimiter $$ create procedure add_math_score(i int) begin declare n int default 0; declare score int default 0; while(n<i) do begin set n=n+1; set score=floor(100*rand()); select score ; update student set Sscore=score where Sno=n; end; end while; end$$ delimiter ;
- 修改前12人的成绩为随机数
(4)repeat UNTLL语句
REPEATE…UNTLL 语句的用法和 Java中的 do…while 语句类似,都是先执行循环操作,再判断条件,区别是REPEATE 表达式值为 false时才执行循环操作,直到表达式值为 true停止。
基本结构
begin repeat ...... until [跳出条件] end repeat; end;
参照while的例子,结果相同
drop procedure add_math_score(); delimiter $$ create procedure add_math_score(i int) begin declare n int default 0; declare score int default 0; repeat begin set n=n+1; set score=floor(100*rand()); select score ; update student set Sscore=score where Sno=n; end; until n>=15 end repeat; end$$ delimiter ;
- repeat 和 while 的区别在于两点,一是条件写的位置,while是在循环块的开头写循环条件,repeat是在结尾处写。
- 二是条件语句,while的条件语句是为真则执行,repeat是条件语句为真时跳出。
- repeat 的 until 哪一行不加分号;
-- 创建过程 DELIMITER $$ CREATE PROCEDURE demo7(IN num INT,OUT SUM INT) BEGIN SET SUM = 0; REPEAT-- 循环开始 SET num = num+1; SET SUM = SUM+num ; UNTIL num>=10 END REPEAT; -- 循环结束 END$$ DELIMITER;
CALL demo7(9,@sum); SELECT @sum;
(5)loop语句
循环语句,用来重复执行某些语句。
执行过程中可使用 LEAVE语句或者ITEREATE来跳出循环,也可以嵌套IF等判断语句。
- LEAVE 语句效果对于Java中的break,用来终止循环;
- ITERATE 语句效果相当于Java中的continue,用来跳过此次循环。进入下一次循环。且ITERATE之下的语句将不在进行。
基本结构
begin [循环名称]:loop ...... if [跳出条件] then leave [循环条件]; end if; end loop [循环条件]; end
批量添加student表数据:
drop procedure add_data(); delimiter $$ create procedure add_data(i int) begin declare flag int default 0; add_loop:loop set flag=flag+1; if flag>i then leave add_loop; end if; insert into student(Sname,Sno,Cno,Ssex,Sage,Sscore) values('批量人',flag+15,1002,'男',22,100); end loop add_loop; end delimiter ;
DELIMITER $$ CREATE PROCEDURE demo8(IN num INT,OUT SUM INT) BEGIN SET SUM = 0; demo_sum:LOOP-- 循环开始 SET num = num+1; IF num > 10 THEN LEAVE demo_sum; -- 结束此次循环 ELSEIF num <= 9 THEN ITERATE demo_sum; -- 跳过此次循环 END IF; SET SUM = SUM+num; END LOOP demo_sum; -- 循环结束 END$$ DELIMITER;
CALL demo8(0,@sum); SELECT @sum;
使用存储过程插入信息
DELIMITER $$ CREATE PROCEDURE demo9(IN s_student VARCHAR(10),IN s_sex CHAR(1),OUT s_result VARCHAR(20)) BEGIN -- 声明一个变量 用来决定这个名字是否已经存在 DECLARE s_count INT DEFAULT 0; -- 验证这么名字是否已经存在 SELECT COUNT(*) INTO s_count FROM student WHERE `name` = s_student; IF s_count = 0 THEN INSERT INTO student (`name`, sex) VALUES(s_student, s_sex); SET s_result = '数据添加成功'; ELSE SET s_result = '名字已存在,不能添加'; SELECT s_result; END IF; END$$ DELIMITER;
调用此函数
CALL demo9("Jim","女",@s_result);
八 存储过程的管理
显示存储过程
SHOW PROCEDURE STATUS
显示特定数据库的存储过程
SHOW PROCEDURE STATUS WHERE db = 'db名字' AND NAME = 'name名字';
显示特定模式的存储过程
SHOW PROCEDURE STATUS WHERE NAME LIKE '%mo%';
显示存储过程的源码
SHOW CREATE PROCEDURE 存储过程名;
删除存储过程
DROP PROCEDURE 存储过程名;
后端调用存储过程的实现
在mybatis当中,调用存储过程
<parameterMap type="savemap" id=“usermap"> <parameter property="name" jdbcType="VARCHAR" mode="IN"/> <parameter property="sex" jdbcType="CHAR" mode="IN"/> <parameter property="result" jdbcType="VARCHAR" mode="OUT"/> </parameterMap> <insert id="saveUserDemo" parameterMap="savemap" statementType="CALLABLE"> {call saveuser(?, ?, ?)} </insert >
调用数据库管理
HashMap<String, Object> map = new HashMap<String, Object>(); map.put("name", "Jim"); map.put("sex","男"); userDao.saveUserDemo(map); map.get(“result”);//获得输出参数
存储函数
函数
语法结构
CREATE FUNCTION存储函数名称(参数列表]) RETURNS type [characteristic ..] BEGIN -- SQL语句RETURN ...; END ;
characteristic说明
- deterministic相同的输入参数产生相同的结果
- no sql 不包含sql语句
- READS SQL DATA 包含读取数据的语句 但不包含写入数据的语句
案例
- 定义存储函数,获取学生表中成绩大于95分的学生数量
/* 定义存储函数,获取学生表中成绩大于95分的学生数量 */ DELIMITER $ CREATE FUNCTION fun_test1() RETURNS INT BEGIN -- 定义统计变量 DECLARE result INT; -- 查询成绩大于95分的学生数量,给统计变量赋值 SELECT COUNT(*) INTO result FROM student WHERE score > 95; -- 返回统计结果 RETURN result; END$ DELIMITER ; -- 调用fun_test1存储函数 SELECT fun_test1(); -- 删除存储函数 DROP FUNCTION fun_test1;
- 计算从1累加到n的值,n为传入的参数值
create function fun1(n int) returns int DETERMINISTIC begin declare total int default 0; while n>0 do set total := total + n; set n := n - 1; end while; return total; end; select fun1(100);
- 删除函数
drop function 函数名;
存储过程和函数区别
- 存储过程用户在数据库中完成特定操作或者任务(如插入,删除等),函数用于返回特定的数据
- 存储过程声明用procedure,
- 存储过程不需要返回类型,函数必须要返回类型
- 存储过程可独立执行,函数不能作为独立的plsql执行,必须作为表达式的一部分
- 存储过程只能通过out和in/out来返回值,函数除了可以使用out,in/out以外,还可以使用return返回值
- sql语句(DML或SELECT)中不可用调用存储过程,而函数可以
应用场景不同
- 如果需要返回多个值和不返回值,就使用存储过程;如果只需要返回一个值,就使用函数
- 存储过程一般用于执行一个指定的动作,函数一般用于计算和返回一个值
- 可以再SQL内部调用函数来完成复杂的计算问题,但不能调用存储过程
返回值不同
存储函数必须有一个且必须只有一个返回值,并且还要指定返回值的数值类型。
存储过程可以有返回值,也可以没有返回值,甚至可以有多个返回值。
两者赋值的方式不同:
存储函数可以采用select …into …方式和set值得方式进行赋值,只能用return返回结果集。
存储过程可以使用select的方式进行返回结果集。
使用方法不同:
函数可以直接用在sql语句当中,可以用来拓展标准的sql语句。
存储过程,需要使用call进行单独调用,不可以嵌入sql语句当中。
函数中函数体的限制较多:
不能使用显式或隐式方式打开transaction、commit、rollback、set autocommit=0等。
但是存储过程可以使用几乎所有的sql语句。
存储过程和函数相同点
- 封装程序逻辑 完成数据处理操作
- 都是预编译 比直接写查询语句执行速度快
- 都可以带参数 以适应数据处理的需求
存储过程不需要返回类型,函数必须要返回类型 - 存储过程可独立执行,函数不能作为独立的plsql执行,必须作为表达式的一部分
- 存储过程只能通过out和in/out来返回值,函数除了可以使用out,in/out以外,还可以使用return返回值
- sql语句(DML或SELECT)中不可用调用存储过程,而函数可以
应用场景不同
- 如果需要返回多个值和不返回值,就使用存储过程;如果只需要返回一个值,就使用函数
- 存储过程一般用于执行一个指定的动作,函数一般用于计算和返回一个值
- 可以再SQL内部调用函数来完成复杂的计算问题,但不能调用存储过程
返回值不同
存储函数必须有一个且必须只有一个返回值,并且还要指定返回值的数值类型。
存储过程可以有返回值,也可以没有返回值,甚至可以有多个返回值。
两者赋值的方式不同:
存储函数可以采用select …into …方式和set值得方式进行赋值,只能用return返回结果集。
存储过程可以使用select的方式进行返回结果集。
使用方法不同:
函数可以直接用在sql语句当中,可以用来拓展标准的sql语句。
存储过程,需要使用call进行单独调用,不可以嵌入sql语句当中。
函数中函数体的限制较多:
不能使用显式或隐式方式打开transaction、commit、rollback、set autocommit=0等。
但是存储过程可以使用几乎所有的sql语句。
存储过程和函数相同点
- 封装程序逻辑 完成数据处理操作
- 都是预编译 比直接写查询语句执行速度快
- 都可以带参数 以适应数据处理的需求
本章笔记是在网上找的资料 以及自己的理解总结出来的笔记希望可以帮助大家,感谢大家的耐心观看 如有错误请即使联系我 我会及时修正