--存储过程:概念类似于函数,就是把一段代码封装起来
--当要执行一点代码的时候,可以调用存储过程
--在封装的语句体里面,可以用,if/else/case/while等结构
--设置编码 setnames -gbk
--查看存储过程
show procedure status;
--删除现有的存储过程
drop procedure p1;
--体会控制结构
create procedure p2( n int ,b char(1) )
begin
if b='h' then
select * from g where num > n ;
else
select * from g where num < n;
end if;
end$
--计算1->n的和
create procedure p3(n smartint )
begin
declare i int;
declare s int;
set i=1;
set s=0;
while i<= n do
set s=s+i;
set i=i+1;
end while;
select s from g;--输出总量
end$
--调用存储工程
call p3();
MySQL 存储过程参数(in)
MySQL 存储过程 “in” 参数:跟 C 语言的函数参数的值传递类似, MySQL 存储过程内部可能会修改
此参数,但对 in 类型参数的修改,对调用者(caller)来说是不可见的(not visible) 。
MySQL 存储过程参数(out)
MySQL 存储过程 “out” 参数:从存储过程内部传值给调用者。在存储过程内部,该参数初始值为 null,
无论调用者是否给存储过程参数设置值
MySQL 存储过程参数(inout)
MySQL 存储过程 inout 参数跟 out 类似,都可以从存储过程内部传值给调用者。不同的是:调用者还
可以通过 inout 参数传递值给存储过程。
总结
如果仅仅想把数据传给 MySQL 存储过程,那就使用“in” 类型参数;如果仅仅从 MySQL 存储过程返回
值,那就使用“out” 类型参数;如果需要把数据传给 MySQL 存储过程,还要经过一些计算后再传回给我
们,此时,要使用“inout” 类型参数。
--删除存储过程
DROP PROCEDURE IF EXISTS proc_employee_findById;
--创建存储过程
CREATE PROCEDURE proc_employee_findById(in n int)
BEGIN
SELECT * FROM employee where id=n;
END
--定义变量
SET @n=1;
--调用存储过程
CALL proc_employee_findById(@n);
1.12 Java 代码调用存储过程(JDBC)
相关 API:java.sql.CallableStatement
使用到 java.sql.CallableStatement 接口,该接口专门用来调用存储过程;
该对象的获得依赖于 java.sql.Connection;
通过 Connection 实例的 prepareCall()方法返回 CallableStatement 对象
prepareCall()内部为一固定写法{call 存储过程名(参数列表 1,参数列表 2)}可用?占位
eg: connection.prepareCall("{call proc_employee(?)}");
存储过程中参数处理:
输 入 参 数 : 通过 java.sql.CallableStatement 实例 的 setXXX()方 法 赋 值, 用 法 等 同于
java.sql.PreparedStatement
输出参数:通过 java.sql.CallableStatement 实例的 registerOutParameter(参数位置, 参数
类型)方法赋值,其中参数类型主要使用 java.sql.Types 中定义的类型
Java 代码调用带输入参数的存储过程 (根据输入 ID 查询雇员信息)
public void executeProcedure()
{
try {
/**
* callableStatement java.sql.CallableStatement
* connection java.sql.Connection
* jdbc调用存储过程原型
* {call 存储过程名(参数列表1,参数列表2)} 可用?代替
*/
跟我一起学 MySQL 存储过程
6
callableStatement=connection.prepareCall("{call
proc_employee_findById(?)}");
callableStatement.setInt(1, 1); //设置输入参数
resultSet=callableStatement.executeQuery();//执行存储过程
if(resultSet.next())
{
System.out.println(resultSet.getInt(1)+"\t"+resultSet.getString(2));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
Java 代码调用带输出参数的存储过程 (返回数据库中的记录数)
public void executeProcedure(){try {
/*** callableStatement java.sql.CallableStatement* connection java.sql.Connection* jdbc调用存储过程原型* {call 存储过程名(参数列表1,参数列表2)} 可用?代替*/callableStatement=connection.prepareCall("{callproc_employee_getCount(?)}");//设置输出参数callableStatement.registerOutParameter(1, Types.INTEGER);//执行存储过程resultSet=callableStatement.executeQuery();if(resultSet.next()){System.out.println(resultSet.getInt(1));}} catch (SQLException e) {e.printStackTrace();
}
}