-- 创建存储过程
-- DELIMITER //
CREATE PROCEDURE pro_first()
BEGIN
select NOW();
END -- //
-- DELIMITER ;
-- 删除存储过程
DROP PROCEDURE pro_first;
-- 查看指定存储过程
SHOW CREATE PROCEDURE pro_first;
-- 查看所有存储过程
SHOW PROCEDURE STATUS;
-- 调用存储过程
CALL pro_first();
-- 练习
create procedure pro_practise()
BEGIN
select 1+3 from dual;
END
call pro_practise();
-- 变量
CREATE procedure pro_variable()
BEGIN
-- 声明局部变量
DECLARE num1 int;
DECLARE username VARCHAR(20) DEFAULT '张三';
select num1, username;
END
CALL pro_variable();
-- 变量赋值
CREATE PROCEDURE pro_variable2()
BEGIN
-- 声明局部变量
DECLARE num1 int;
DECLARE num2 int;
DECLARE result int;
-- 变量赋值
SET num1 = 10;
SET num2 := 15;
SET result = num1 + num2;
select result;
END
CALL pro_variable2();
-- 定义用户变量(注意:使用用户变量的时候,不需要声明数据类型)
set @userVar := '我是用户变量';
CREATE PROCEDURE pro_testuservar()
BEGIN
set @userVar = '用户变量值改了';
select @userVar;
END
DROP PROCEDURE pro_testuservar;
CALL pro_testuservar();
CREATE PROCEDURE pro_testuservar2()
BEGIN
select @userVar;
END
CALL pro_testuservar2();
-- select into 语句(注意:使用时要保证select语句查回的数据只有一条)
CREATE PROCEDURE pro_selectinto()
BEGIN
DECLARE vcity VARCHAR(40);
select city into vcity from extend_mobile where pre = '1300000';
select vcity;
END
DROP PROCEDURE pro_selectinto;
CALL pro_selectinto();
-- 练习
create PROCEDURE pro_selectinto_practise()
BEGIN
DECLARE vpre int;
DECLARE vprovice VARCHAR(40);
DECLARE vcity VARCHAR(40);
select pre, provice, city into vpre, vprovice, vcity from extend_mobile where pre = '1300000';
select vpre, vprovice, vcity;
END
CALL pro_selectinto_practise();
-- 参数 in (不写,默认是in 输入参数)
CREATE procedure pro_param(in p_pre int)
BEGIN
DECLARE vcity VARCHAR(40);
SELECT city into vcity from extend_mobile where pre = p_pre;
select vcity;
END
CALL pro_param('1300001');
-- 参数out
set @provice = '';
create PROCEDURE pro_param_out(out p_out VARCHAR(40), in p_in INT)
BEGIN
select provice into p_out from extend_mobile where pre = p_in;
END
CALL pro_param_out(@provice, '1300002');
select @provice;
-- 参数inout
CREATE PROCEDURE pro_param_inout(INOUT num int)
BEGIN
SET num = num * 5;
END
set @userNum = 10;
select @userNum;
CALL pro_param_inout(@userNum);
-- if语句1
CREATE PROCEDURE pro_if(in p_pre int)
BEGIN
DECLARE vcode int;
select code into vcode from extend_mobile where pre = p_pre;
IF vcode = 10 THEN
select 1;
ELSE
select 2;
END IF;
END
CALL pro_if('1300001');
-- if语句2
CREATE PROCEDURE pro_if2(in p_pre int)
BEGIN
DECLARE vcity VARCHAR(40);
select city into vcity from extend_mobile where pre = p_pre;
IF vcity = '北京' THEN
select 1;
ELSEIF vcity = '常州' THEN
select 2;
ELSE
select 3;
end if;
END
CALL pro_if2('1300002');
-- case when 语句
CREATE PROCEDURE pro_case_when(in p_pre int)
BEGIN
DECLARE vcity VARCHAR(40);
select city into vcity from extend_mobile where pre = p_pre;
CASE vcity
when '北京' THEN
select 1;
when '常州' THEN
select 2;
ELSE
select 3;
END CASE;
END
CALL pro_case_when('1300002');
CREATE PROCEDURE pro_case_when2(in p_pre int)
BEGIN
DECLARE vcity VARCHAR(40);
select city into vcity from extend_mobile where pre = p_pre;
CASE
when vcity = '北京' THEN
select 1;
when vcity = '常州' THEN
select 2;
ELSE
select 3;
END CASE;
END
CALL pro_case_when2('1300002');
-- case when 用于普通查询语句
select id, name, case sex when 0 then '女'
when 1 then '男'
else '未知' end as gender
from t_person;
-- while语句
create procedure pro_while()
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE sum INT DEFAULT 0;
WHILE i < 11 DO
set sum = sum + i;
set i = i + 1;
END WHILE;
select sum;
END
CALL pro_while();
-- REPEAT语句
create PROCEDURE pro_repeat()
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE sum INT DEFAULT 0;
REPEAT
SET sum = sum + i;
SET i = i + 1;
until i > 10 END REPEAT;
select sum;
END
CALL pro_repeat();
-- LOOP语句
CREATE PROCEDURE pro_loop()
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE sum INT DEFAULT 0;
looplabel: LOOP
SET sum = sum + i;
SET i = i + 1;
IF i > 10 THEN
LEAVE looplabel; -- 跳出循环
END IF;
END LOOP looplabel;
select sum;
END
CALL pro_loop();
-- JDBC调用存储过程
CREATE PROCEDURE pro_jdbc(in p_pre int, OUT p_city VARCHAR(40))
BEGIN
SELECT city into p_city from extend_mobile where pre = p_pre;
END
set @uCity = '';
CALL pro_jdbc('1300000', @uCity);
SELECT @uCity;
drop PROCEDURE pro_jdbc
-- 登录业务 p_flag: 0 失败 1 成功
CREATE PROCEDURE pro_login(in p_username VARCHAR(255), in p_password VARCHAR(255), out p_flag INT)
BEGIN
DECLARE count int;
SELECT count(*) into count FROM t_user where f_name = p_username and f_password = p_password;
IF count = 1 THEN
SET p_flag = 1;
ELSE
SET p_flag = 0;
END IF;
END