存储过程
定义:
create procedure 过程名(参数)
begin
多条sql语句
end
调用:
call 过程名(实参)
实例1--无参的存储过程:
△小细节:要把默认的语句结束“;”号改成其它如“$$”,这样存储过程中定义的分号就不被看成是语句结束(否则会直接被提交)
最后再把“;”号还原成默认的结束符。
delimiter $$
create procedure p1()
begin
insert into stud values('P0010','小李',23);
select * from stud;
end$$
delimiter ;
call p1();
实例2--有参的存储过程:
delimiter $$
create procedure p2( in id varchar(32), in nm varchar(30), in age int )
begin
insert into stud values(id,nm,age);
select * from stud;
end$$
delimiter ;
call p2('P011','小五',28);
实例3--有返回值的存储过程:
delimiter $$
create procedure p3( in id varchar(32), in nm varchar(30), in age int, out num int )
begin
insert into stud values(id,nm,age)
select * from stud;
select count(*) into num from stud;
end$$
delimiter ;
CALL p3('P012','小小五',27, @aa); /*调用且用aa接收结果*/
SELECT @aa; /*显示用户变量aa*/
系统变量名称:@@变量名
用户变量名称:@变量名
//binary
mysql查询默认是不区分大小写的如:
select * from table_name where a like 'a%'
select * from table_name where a like 'A%'
效果是一样的。
要让mysql查询区分大小写,可以:
select * from table_name where binary a like 'a%'
select * from table_name where binary a like 'A%'
也可以在建表时,加以标识:
create table table_name(
a varchar(20) binary
)
这里补jdbc 操作存储过程的java代码:
演示Java中如何调用数据库中的存储过程:
1.调用存储过程得用CallableStatement。
2. 它和PreparedStatement类似,也是Statement的子类,也可把用户输入用
参数封装的方式防黑。
3. 即在父类的基础上增加了一些功能。
下面进行代码演示
1. 无参, 如 call p1();
@Test
public void demo1() throws Exception {
Connection con = ConnUtils.getConn();
// ※※※调用存储过程得用 CallableStatement语句对象
CallableStatement cs = con.prepareCall("call p1()");
ResultSet rs = cs.executeQuery(); // 如果存储过程调用之后会有返回结果,则最好用executeQuery()
while (rs.next()) {
System.out.println(rs.getString("name"));
}
con.close();
}
2. 有输入参, 如 call p2('P011','小五',28);
// 有输入参, 如 call p2('P011','小五',28);
@Test
public void demo2() throws Exception {
Connection con = ConnUtils.getConn();
// CallableStatement cs = con.prepareCall("call p2('P011','小五',28)");
// //sql写死了
CallableStatement cs = con.prepareCall("call p2(?,?,?)"); // sql写活
cs.setString(1, "P201");
cs.setString(2, "大王");
cs.setInt(3, 45);
ResultSet rs = cs.executeQuery(); // 如果存储过程调用之后会有返回结果,则最好用executeQuery()
while (rs.next()) {
System.out.println(rs.getString("name"));
}
con.close();
}
3.有输入参和返回值, 如 CALL p3('P012','小小五',27, @aa);
// 有输入参和返回值, 如 CALL p3('P012','小小五',27, @aa);
@Test
public void demo3() throws Exception {
Connection con = ConnUtils.getConn();
CallableStatement cs = con.prepareCall("call p3(?,?,?,?)"); // 最后一个?号是用于输出参数的
// 3个输入参数
cs.setString(1, "P202");
cs.setString(2, "大大王");
cs.setInt(3, 55);
// ※※注册一个返回类型的参数
cs.registerOutParameter(4, Types.INTEGER); //把第4个问号注册成输出参数
//cs.execute(), cs.executeUpdate()
ResultSet rs = cs.executeQuery(); // 如果存储过程调用之后会有返回结果,则最好用executeQuery()
while (rs.next()) {
System.out.println(rs.getString("name"));
}
//※※
int n = cs.getInt(4); //获取存储过程的返回值,之前已经把它注册到第4个点位符了
System.out.println("n="+n);
con.close();
}