MySQL 存储过程

存储过程(Stored Procedure)是数据库系统中,一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
在数据库系统中,存储过程和触发器具有很重要的作用。无论是存储过程还是触发器,都是SQL 语句和流程控制语句的集合。

常用使用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
-- 删除存储过程
DROP PROCEDURE IF EXISTS `pro`;

-- 修改结束符
DELIMITER //
-- 存储过程过程
CREATE PROCEDURE `pro` (IN a INT, IN b INT, OUT c INT)
-- 开始存储过程
BEGIN

-- 定义循环结束标识符
DECLARE Done INT DEFAULT 0;
-- 定义变量
DECLARE VAR_NAME, VAR_ADD VARCHAR(50);
-- 定义光标(并使用参数)
DECLARE CUR_USER CURSOR FOR SELECT USERNAME, ADDRESS FROM USER LIMIT a, b;
-- 发生异常设置结束符, 02000 = [输入, 更新, 删除, FETCH最后一行]
-- 出现错误也继续执行
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done = 1;

SET

-- 打开游标
OPEN CUR_USER;

-- 执行循环
loop1: LOOP
-- 获得一行
FETCH CUR_USER INTO VAR_NAME, VAR_ADD;
-- 判断是否还有最后一行
IF Done = 1 THEN
LEAVE loop1;
END IF;
-- 查询变量(返回一个结果集)
SELECT VAR_NAME, VAR_ADD, 'k';

END LOOP loop1;

-- 关闭游标
CLOSE CUR_USER;

-- 设置返回值参数c
SET c = a + b;

-- 结束存储过程
END //
-- 修改结束符
DELIMITER ;

----------------------------------------------------

set @a = 1 -- 定义变量
set @c = 0 -- 定义变量
call pro(@a, 10, @c) -- 执行存储过程
select @c; -- 显示@c变量

MySQL 中直接用 select 即可返回结果集。
而 Oracle 则需要使用游标来返回结果集。
这一点 Mysql 相对比较方便

Java jdbc执行存储过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java_spring?useUnicode=true&characterEncoding=UTF-8", "root", "wjjyy");

CallableStatement call = conn.prepareCall("{call pro(?,?,?)}");
call.setInt(1, 1);
call.setInt(2, 10);

boolean execute = call.execute();
// 获得返回值
System.out.println("a + b : " + call.getInt(3));

while (execute){
ResultSet resultSet = call.getResultSet();
while(resultSet.next()){
System.out.println(resultSet.getString(1) + ":" + resultSet.getString(2));
}
resultSet.close();
System.out.println("------------------------");
execute = call.getMoreResults();
}

call.close();
conn.close();

MySql 存储过程详情

循环

LOOP循环

1
2
3
4
5
名: LOOP 
命令
LEAVE 名 -- back
ITERATE 名 -- continue
END LOOP 名

REPEAT循环

1
2
3
4
名: REPEAT 
命令
UNTIL 退出条件
END REPEAT 名

WHILE循环

1
2
3
名: WHILE 继续循环条件 DO 
命令
END WHILE 名

判断

1
2
3
4
IF 条件 THEN 命令
   [ELSEIF 条件 THEN 命令] ...
   [ELSE 命令]
END IF

分支

1
2
3
4
5
CASE 值
WHEN 何值 THEN 命令
[WHEN 何值 THEN 命令] ...
[ELSE 命令]
END CASE
 上一篇

优化 数据库 mysql