Mysql存储过程
-- 删除存储过程
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执行存储过程
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循环
名: LOOP
命令
LEAVE 名 -- back
ITERATE 名 -- continue
END LOOP 名
REPEAT循环
名: REPEAT
命令
UNTIL 退出条件
END REPEAT 名
WHILE循环
名: WHILE 继续循环条件 DO
命令
END WHILE 名
判断
IF 条件 THEN 命令
[ELSEIF 条件 THEN 命令] ...
[ELSE 命令]
END IF
分支
CASE 值
WHEN 何值 THEN 命令
[WHEN 何值 THEN 命令] ...
[ELSE 命令]
END CASE