转载:https://blog.csdn.net/weixin_42586723/article/details/118554928
CREATE
[DEFINER = { user | CURRENT_USER }]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
[ IN | OUT | INOUT ] param_name type
BEGIN ...... END$$
-- $$ 可以自定义为其他作为结束符
DELIMITER $$
CREATE PROCEDURE nbsp_procedure(IN 参数名 参数类型)
BEGIN .... END
-- 声明语句结束符,可以自定义:
delimiter $$
-- 创建存储过程,名为 nbsp_procedure 参数为空, 执行输出 'hello world'
create procedure nbsp_procedure () -- 默认当前用户下创建 create definer = `nbsp`@`%` procedure nbsp_procedure ()
begin
select 'hello world';
end $$
-- 声明语句结束符
delimiter ;
-- 调用存储过程
call nbsp_procedure();
-- 删除存储过程
drop procedure nbsp_procedure;
-- 语法
declare 变量名 变量类型 [default 默认值]
-- 举例
declare name varchar(32) '张三'
-- set 赋值
delimiter $$
drop procedure if exists var01$$
create procedure var01()
begin
-- 声明变量
declare username varchar(32) default '张三';
-- 为变量赋值
set username = '李四';
select username;
end $$
delimiter ;
call var01();
delimiter $$
drop procedure if exists var02$$
-- 创建存储过程
create procedure var02()
begin
set @username='张三';
end $$
delimiter ;
-- 调用存储过程
call var02();
-- 查询会话变量的值
select @username;
set @username='wangwu';
delimiter $$
drop procedure if exists var03$$
-- 传入两个变量,第一个为输入in变量,第二个为是输出out变量。当输入用户id 时,返回用户名。
create procedure var03(in id int,out username varchar(32))
begin
select id,username;
-- select 'procedure into username' into username;
-- set username='procedure into username'
end $$
delimiter ;
-- 在还未调用存储过程时,我们发现此时的会话变量@username的值依然为 wangwu
select @username;
call var03(35,@username);
-- 此时会话变量为NULL
select @username;
IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list]...
[ELSE statement_list]
END IF
------------------------------------------------------------------------------------------
IF 判断条件 THEN 执行语句
[ELSELF 判断条件 THEN 执行语句]
[ELSE 执行语句]
END IF
set @username = '张三风';
-- 存过创建失败,不清楚原因
delimiter $$
drop procedure if exists if01$$
create procedure if01()
begin
IF @username = '张三' THEN
select concat('我是',@username);
ELSEIF @username = '张三风' THEN
select '张三是我徒弟';
ELSE
select '我是栗四,不认识张三';
END IF;
end $$
delimiter ;
call if01;
CASE
WHEN expr_condition THEN ...do something...
WHEN expr_condition THEN ...do something...
....多个 WHEN THEN 语句.....
[ELSE ...do something...]
END CASE;
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list]...
[ELSE statement_list]
END CASE
------------------------------------------------------------------
CASE 参数变量
WHEN 参数变量1 THEN 执行语句]
[WHEN 参数变量2 THEN 执行语句]
[ELSE 执行语句]
END CASE
DELIMITER $$
CREATE PROCEDURE proc1(IN parameter int)
begin
declare var int;
set var=parameter+1;
case var
when 0 then
insert into t values(17);
when 1 then
insert into t values(18);
else
insert into t values(19);
end case;
end;
$$
DELIMITER ;
[begin_label:] LOOP
statement_list ;
END LOOP [begin_label];
------------------------------------------------------------------
循环名: loop
-- 循环体
执行语句;
end loop 循环名;
-- 需求: 打印1-10,输出结果为 1,2,3,4......9,10
-- 如果存在loop_test,则先删除
drop procedure if exists loop_test;
delimiter $$
-- 创建存储过程loop_test
create procedure loop_test()
begin
declare c_index int default 1;
declare result_str varchar(256) default '1';
cnt: loop
-- 循环10次,则跳出循环
if c_index >= 10 then
leave cnt;
end if;
-- 自增
set c_index = c_index + 1;
-- 拼接
select concat(result_str, ',', c_index) into result_str;
end loop cnt;
-- 查询结果
select result_str;
end $$
delimiter ;
call loop_test();
public void loop_test() {
String result_str = "1";
int c_index = 1;
while (true) {
if (c_index >= 10) {
break;
}
c_index = c_index + 1;
result_str = result_str + "," + c_index;
}
System.out.println(result_str);
}
[WHILE标注] : WHILE 条件表达式 DO
执行语句
END LOOP [WHILE标注];
drop procedure if exists sp_flow_while;
delimiter $$
-- 创建存储过程sp_flow_while
create procedure sp_flow_while()
begin
declare c_index int default 1;
-- 收集结果集字符串
declare result_str varchar(256) default '1';
while c_index < 10 do
set c_index = c_index + 1;
set result_str = concat(result_str, ',', c_index);
end while;
-- 查询结果
select result_str;
end $$
delimiter ;
call sp_flow_while();
[REPEAT标注]:REPEAT
执行语句
UNTIL 条件表达式
END REPEAT [REPEAT标注]
drop procedure if exists test; -- 如果存在test存储过程则删除
delimiter $$ -- 定义标识符为双斜杠
create procedure test() -- 创建无参存储过程,名称为test
begin
declare i int default 6; -- 申明变量
repeat
insert into test values (i); -- 往test表添加数据
set i = i + 1; -- 循环一次,i加一
until i > 10 end repeat; -- 结束循环的条件: 当i大于10时跳出repeat循环
select * from test; -- 查看test表数据
end;
$$ -- 结束定义语句
delimiter ;
ITERATE [LOOP/REPEAT/WHILE标注]
drop procedure if exists test; -- 如果存在test存储过程则删除
delimiter $$ -- 定义标识符为双斜杠
create procedure test() -- 创建无参存储过程,名称为test
begin
declare i int(11) default 0; -- 申明变量
myloop:loop
set i = i + 1;
if i < 5 then iterate myloop; -- 跳过本次循环
elseif i > 8 then leave myloop;
end if;
insert into test values (i);
end loop myloop;
select * from test;
end;
$$
delimiter ; -- 结束定义语句