1、基本语法
DELIMITER $$
CREATE
/*
in代表输入参数(默认情况下为in参数),表示该参数的值必须由调用程序指定。
ou代表输出参数,表示该参数的值经存储过程计算后,将out参数的计算结果返回给调用程序。
*/
PROCEDURE 数据库名.存储过程名([in变量名 类型,out 参数 2,...])
/*LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'*/
BEGIN
[DECLARE 变量名 类型 [DEFAULT 值];]
存储过程的语句块;
END$$
DELIMITER ;
2、创建存储过程
DELIMITER $$
CREATE
PROCEDURE `xc`()
-- 存储过程体
BEGIN
-- DECLARE声明 用来声明变量的
DECLARE de_name VARCHAR(10) DEFAULT '';
SET de_name = "星晨创建存储过程~";
-- 测试输出语句(不同的数据库,测试语句都不太一样。
SELECT de_name;
END$$
-- 查询存储过程
CALL xc();
3、有参数的存储过程
DELIMITER $$
-- 查询user表中的sex为男性有多少个人
CREATE
PROCEDURE `xc2`(IN s_sex CHAR(1),OUT s_count INT)
-- 存储过程体
BEGIN
-- 把SQL中查询的结果通过INTO赋给变量
SELECT COUNT(*) INTO s_count FROM user WHERE sex= s_sex;
SELECT s_count;
END$$
DELIMITER ;
-- @s_count表示测试出输出的参数
CALL xc2 ('男',@s_count);
4、流程控制语句 IF ELSE
DELIMITER $$
CREATE
PROCEDURE `xc3`(IN `day` INT)
-- 存储过程体
BEGIN
IF `day` = 0 THEN
SELECT '星期天';
ELSEIF `day` = 1 THEN
SELECT '星期一';
ELSEIF `day` = 2 THEN
SELECT '星期二';
ELSE
SELECT '其它日期';
END IF;
END$$
DELIMITER ;
CALL xc3(1);
5、条件控制语句 CASE
DELIMITER $$
CREATE
PROCEDURE xc4(IN num INT)
BEGIN
CASE -- 条件开始
WHEN num<0 THEN
SELECT '负数';
WHEN num>0 THEN
SELECT '正数';
ELSE
SELECT '不是正数也不是负数';
END CASE; -- 条件结束
END$$
DELIMITER;
CALL xc4(1);
DELIMITER $$
CREATE
PROCEDURE xc5(IN num INT)
BEGIN
CASE num -- 条件开始
WHEN 1 THEN
SELECT '输入为1';
WHEN 0 THEN
SELECT '输入为0';
ELSE
SELECT '不是1也不是0';
END CASE; -- 条件结束
END$$
DELIMITER;
CALL xc5(0);
6、循环语句 WHILE
DELIMITER $$
CREATE
PROCEDURE xc6(IN num INT,OUT SUM INT)
BEGIN
SET SUM = 0;
WHILE num<10 DO -- 循环开始
SET num = num+1;
SET SUM = SUM+num;
END WHILE; -- 循环结束
END$$
DELIMITER;
-- 调用函数
CALL xc6(0,@sum);
-- 查询函数
SELECT @sum;
7、循环语句 REPEAT UNTLL
-- 创建过程
DELIMITER $$
CREATE
PROCEDURE xc7(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 xc7(9,@sum);
SELECT @sum;
8、循环语句 LOOP
DELIMITER $$
CREATE
PROCEDURE xc8(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;
9、存储过程插入信息
DELIMITER $$
CREATE
PROCEDURE xc9(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 userWHERE `name` = s_student;
IF s_count = 0 THEN
INSERT INTO user(`name`, sex) VALUES(s_student, s_sex);
SET s_result = '数据添加成功';
ELSE
SET s_result = '名字已存在,不能添加';
SELECT s_result;
END IF;
END$$
DELIMITER;
CALL xc9("xc","男",@s_result);
10、存储过程CRUD
-- 查询
SHOW PROCEDURE STATUS
SHOW PROCEDURE STATUS WHERE db = 'db名字' AND NAME = 'name名字';
-- 显示存储过程的源码
SHOW CREATE PROCEDURE 存储过程名;
-- 删除
DROP PROCEDURE 存储过程名;
11、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 >
Java代码调用
HashMap<String, Object> map = new HashMap<>();
map.put("name", "星晨");
map.put("sex","男");
userDao.saveUserDemo(map);
map.get(“result”);//获得输出参数