CallableStatement主要是调用数据库中的存储过程,CallableStatement也是
Statement接口的子接口,在使用CallableStatement的时候可以接受过程的返回值;
现在先建立一个mysql的存储过程:
delimite //---将分割符定义为//,默认的分割符是个分号;
drop procedure myproc //-----删除过程
create procedure myproc(IN p1 int,INOUT p2 int,OUT p3 int)
begin
select p1,p2,p3; --------------输出p1,p2,p3的内容
set p1=10;
set p2=20;
set p3=30;
end
//
IN类型:默认的设置,什么都不声明就表示IN类型,只是将内容传递进来;
INOUT类型:表示把值传递到过程中,并且可以保留过程对值的修改,引用
OUT:可以不用传递内容,过程中对此值的操作可以返回;
delimiter ;
set @x1=70;
set @x2=80;
call myproc(@x1,@x2,@x3);
/*---创建数据库表
drop table user;
create table user(
id int auto_increment primary key,
name varchar(30) not null,
password varchar(32) not null,
age int not null,
sex varchar(2) default '男',
birthday Date
);
*/
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.CallableStatement;
import java.sql.TypesSS;
public class Demo{
//定义数据库的驱动程序
public static final String DBDRIVER="oracle.jdbc.driver.OracleDriver";
//定义数据库的连接地址:
public static final String DBURL="jdbc:oracle:thin:@localhost:1521:lid";
//定义数据库的用户名
public static final String DBUSER="root";
//定义数据库的密码
public static final String DBPASSWORD="123";
public static void main(String args[]) throws Exception{
Connection conn=null;
CallableStatement cstmt=null;
Class.forName(DBDRIVER);
conn=DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD);
String sql="{CALL myproc(?,?,?)}";
cstmt=conn.prepareCall(sql);
cstmt.setInt(1,70);
cstmt.setInt(2,80);
cstmt.registerOutParameter(2,Types.INTEGER);
cstmt.registerOutParameter(3,Types.INTEGER)
cstmt.execute();
System.out.println("INOUT的返回值:"+cstmt.getInt(2));
System.out.println("OUT 的返回值:"+cstmt.getInt(3));
cstmt.clost();
psmt.close();
conn.close();
}
}