存储过程初体验(MySQL)
1. 什么是存储过程?
存储过程可以封装SQL语句集
,可以用来完成一些比较复杂的业务逻辑,并且可以出参和入参(这也就是为什么Java代码可以直接传参调用存储过程,完成一批操作的原因。)
2. 存储过程的优缺点
- 优点
- 在生产环境下,可以实现不修改代码就可以修改业务逻辑,并且不需要重启服务器。
- 执行速度快,存储过程会比分散开的一条一条的
SQL
语句执行快。
- 缺点
- 调试不方便,你要想,如果是JAVA代码实现的,打断点调试多方便,存储过程你并不能打断点。
- 迁移数据库就需要重新编写存储过程!因为对应的语法不一样。
3. MySQL
存储过程使用
3.1 随便搞张表
CREATE TABLE `test_org` (
`id` int(11) NOT NULL,
`org_code` varchar(255) DEFAULT NULL,
`org_name` varchar(255) DEFAULT NULL,
`up_code` varchar(255) DEFAULT NULL,
`org_level` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `test_org` VALUES (1, 'fourth', '第四级部门', 'third', '4');
INSERT INTO `test_org` VALUES (2, 'third', '第三级部门', 'second', '3');
INSERT INTO `test_org` VALUES (3, 'second', '第二级部门', 'first', '2');
INSERT INTO `test_org` VALUES (4, 'first', '顶级部门', NULL, '1');
3.2 第一个存储过程体验
-- 声明语句结束符 可以自定义随便写
delimiter $$
create procedure hello_world()
begin
-- 这里面写对于的操作SQL
select * from test_org;
end $$
-- 调用
call hello_world('first');
3.3 传参的存储过程
-- 声明语句结束符 可以自定义随便写
delimiter $$
create procedure hello_world1(in orgCodeTemp VARCHAR(30))
begin
-- 这里面写对于的操作SQL
select * from test_org WHERE org_code = orgCodeTemp;
end $$
-- 调用
call hello_world1('first');
3.4 带 if 判断传参的存储过程
-- 声明语句结束符 可以自定义随便写
delimiter $$
create procedure hello_world2(in orgCodeTemp VARCHAR(30))
begin
if orgCodeTemp='first'
then
select * from test_org WHERE org_code = orgCodeTemp;
else
select * from test_org;
end if;
end $$
-- 调用
call hello_world2('asdasdasd');
3.5 带case的存储过程
-- 声明语句结束符 可以自定义随便写
delimiter $$
create procedure hello_world_var_case(in orgCodeTemp VARCHAR(30))
begin
case orgCodeTemp
when 'first' THEN
select * from test_org WHERE org_code = orgCodeTemp;
when 'second' THEN
select * from test_org WHERE org_code = orgCodeTemp;
else
select * from test_org;
end case;
end $$
-- 调用
call hello_world_var_case('first');
3.6 传多个参数的带case的存储过程
-- 声明语句结束符 可以自定义随便写
delimiter $$
create procedure hello_world_var_case1(in orgCodeTemp VARCHAR(30),in orgLevelTemp VARCHAR(30))
begin
case orgCodeTemp
when 'first' THEN
select * from test_org WHERE org_code = orgCodeTemp;
when 'second' THEN
select * from test_org WHERE org_level = orgLevelTemp;
else
select * from test_org;
end case;
end $$
-- 调用
call hello_world_var_case1('second','2');