存储过程简介
简介
MySQL 5.0 版本开始支持存储过程。
存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。
存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。
存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。文章来源:https://www.toymoban.com/news/detail-472141.html
存储过程优点
- 存储过程可封装,并隐藏复杂的商业逻辑。
- 存储过程可以回传值,并可以接受参数。
- 存储过程无法使用 SELECT 指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同。
- 存储过程可以用在数据检验,强制实行商业逻辑等。
存储过程缺点
- 存储过程,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。
- 存储过程的性能调校与撰写,受限于各种数据库系统。
创建存储过程
创建语法
CREATE
[DEFINER = { user | CURRENT_USER }]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
proc_parameter:
[ IN | OUT | INOUT ] param_name type
characteristic:
COMMENT 'string'
| LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
routine_body:
Valid SQL routine statement
[begin_label:] BEGIN
[statement_list]
……
END [end_label]
举例
DROP PROCEDURE IF EXISTS fun_fun_name;
delimiter $$ //结束符定义为$$
create procedure fun_fun_name(in start_day date) // 个人习惯:存储过程名称方式fun_'存储过程名称',输入参数-开始时间
begin
-- 定义变量
declare s int DEFAULT 0;
declare res_t_cnt int default 0;
declare t_name varchar(15);
declare var_name varchar(50);
declare var_age int;
declare var_sex varchar(5);
declare var_mobile varchar(11);
-- 定义游标
declare res_user CURSOR FOR select name,age,sex,mobile from sys_user;
-- 声明当游标遍历完后将标志变量置成某个值
DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1;
-- 打开游标
open res_user;
-- 将游标中的值赋值给变量,变量名称与表名不能相同
fetch res_user into var_name,var_age,var_sex,var_mobile;
while s <> 1 do
-- 临时保存变量,是否存在当前表
SELECT COUNT(*) into res_t_cnt FROM information_schema.`TABLES` WHERE TABLE_NAME= concat('t_', var_mobile);
-- 动态表名
set t_name = concat('t_', var_mobile);
if (res_t_cnt > 0) then
-- 当前表存在,执行数据插入,拼接SQL注意空格及引号
set @sqlStr = concat('insert into t_result select name, age,"', var_mobile,'","', var_sex, '" from ', t_name, ' where create_date = ?');
set @search_date = date_format(start_day, '%Y-%m-%d');
PREPARE stmt from @sqlStr;
EXECUTE stmt using @search_date;
end if;
-- 游标移动
fetch res_user into var_name,var_age,var_sex,var_mobile;
end while;
close res_pipe;
end $$
delimiter ;
上述代码创建了存储过程,并有一个日期类型的入参,存储过程中使用游标存储查询结果,并在之后的代码中循环使用。之后动态拼接SQL,并传入参数执行动态拼接的SQL。文章来源地址https://www.toymoban.com/news/detail-472141.html
Springboot中使用存储过程
xml文件中
<select id="insertDxData" statementType="CALLABLE">
{
call fun_fun_name(
#{startDay, jdbcType = DATE}
)
}
</select>
Mapper文件中
void insertDxData(@Param("startDay") Date startDay);
到了这里,关于Springboot中使用mysql存储过程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!