最近只是简单的学习了一下存储过程,梳理一下知识点。
大家可以在慕课网上面找到相应的教程视频,这里有一篇博客:
王者佳暮的博客:
http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html
大家可以找到更多详细内容关于存储搓成,比如变量,语句,创建等等,感谢前辈们的帮助和分享。
言归正传,上次我简单的整理了无参的存储过程的调用,今天我们详细介绍一下无参,入参,出参三种存储过程以及JDBC的调用过程。我使用的是MySQL, Navicat for MySQL,下面的例子都是在MySQL上进行的。
1. MySQL 存储过程的创建:
CREATE PROCEDURE name (IN/OUT/INOUT param TYPE, …)
这里一共有三种参数类型,IN, OUT, INOUT. 其中:
IN 输入参数, 举个例子:
SELECT * FROM people_table WHERE name = ?;
这里的?就是你需要输入的参数,该参数在调用存储过程是指定。
OUT输出参数,举个例之:
SELECT COUNT(*) INTO count FROM people_table;
这里的count就是输出参数,这条SQL语句是查询表中记录的数目并返回count值。其中count就作为SQL语句的输出参数返回。
INOUT 输入输出参数: 调用时指定,并且可被改变和返回。
在MySQL命令行下创建存储过程:
a. 无参存储过程:
mysql> DELIMITER //
mysql> CREATE PROCEDURE demo_name
> BEGIN
> select * from people_table;
> END;
> //
mysql> DELIMITER ;
执行过程:
mysql> call demo_name;
其中DELIMITER // 和DEMILITER ;两句是用来声明分隔符,具体内容可以参见王者佳暮的博客,我是在那里学来的。
b. 入参存储过程:
mysql> DELIMITER //
mysql> CREATE PROCEDURE demo_name(IN sp_name VARCHAR(20))
> BEGIN
> select * from people_table where name = sp_name;
> END;
> //
mysql> DELIMITER ;
执行过程:
mysql> set @sp_name = "Nancy"
mysql> call demo_name(@sp_name);
c. 出参存储过程:
mysql> DELIMITER //
mysql> CREATE PROCEDURE demo_name(OUT count int)
> BEGIN
> select count(*) into count from people_table;
> END;
> //
mysql> DELIMITER ;
执行过程:
mysql> set @count = 0;
mysql> call demo_name;
mysql> select @count;
以上是在MySQL命令行下创建存储过程,语法结构都比较简单,可以在网上找到更多资源,这里只是入门介绍。
在Navicat for MySQL图形界面下面创建存储过程:
a. 右键function,新建procedure
b. 设置参数类型,IN,OUT,INOUT
c. 编写procedure(注意修改下面的参数类型,有时候可能会有错误)
d. 保存执行
这里我们就创建好了存储过程。
2. JDBC调用存储过程:
上次我们简单的讲过无参存储过程的调用,JDBC的调用过程基本一致。
a. 无参存储过程调用:
public static void select_nofilter() throws SQLException{
//1.获得链接
Connection conn = DBUtil.getConnection();
//2.获得callablestatement
CallableStatement cs = conn.prepareCall("call sp_select_nofilter()");
//3.执行存储过程
cs.execute();
//4. 处理返回的结果: 1. 结果集
ResultSet rs = cs.getResultSet();
while(rs.next()){
System.out.println(rs.getString("name"));
}
}
b.入参存储过程调用:
public static List<Person> select_filter(String sp_name) throws Exception {
List<Person> ps = new ArrayList<Person>();
Person p = null;
//1.获得链接
Connection conn = DBUtil.getConnection();
//2.获得callablestatement
CallableStatement cs = conn.prepareCall("call select_by_name(?)");
//设置入参
cs.setString(1, sp_name);
//3.执行存储过程
cs.execute();
//4. 处理返回的结果: 1. 结果集
ResultSet rs = cs.getResultSet();
while(rs.next()){
p = new Person();
p.setAge(rs.getInt("age"));
p.setGender(rs.getString("gender"));
p.setID(rs.getInt("id"));
p.setName(rs.getString("name"));
ps.add(p);
}
return ps;
}
c. 出参存储过程调用:
public static Integer select_count() throws Exception{
Integer count = 0;
//1.获得链接
Connection conn = DBUtil.getConnection();
//2.获得callablestatement
CallableStatement cs = conn.prepareCall("call select_count_2(?)");
//设置出参
cs.registerOutParameter(1, Types.INTEGER);
//3.执行存储过程
cs.execute();
//4. 处理:出参
count = cs.getInt(1);
return count;
}
大家可以看到,三种存储过程的调用基本相同,唯一的不同之处在于参数的设置,注意设置入参和出参的代码,以及获取出参的代码。
3. 其他内容
以上就是存储过程基本的创建和调用,还有一些只是,包括变量的声明,存储过程的修改和删除,都可以在网上找到相应的内容。