存储过程(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
|