IN和OUT 参数¶
将 IN 参数传给CallableStatement对象是通过setXXX方法完成的。该方法继承PreparedStatement接口。所传入参数的类型决定了所用的 setXXX 方法,例如用 setFloat 来传入 float 值。
如果存储过程定义有OUT 参数,则在执行 CallableStatement 对象以前必须先注册每个 OUT 参数的 JDBC 类型。注册 JDBC 类型是用 registerOutParameter 方法来完成的。语句执行完后,CallableStatement 的 getXXX 方法将取回参数值。正确的 getXXX 方法是为各参数所注册的 JDBC 类型所对应的 Java 类型。换言之,registerOutParameter 使用的是 JDBC 类型,而 getXXX 将之转换为 Java 类型。
下面是一个示例:
try {
// 创建存储过程
String sql = "CREATE OR REPLACE PROCEDURE TEST_PRO1"
+ "(in_param IN INT,out_param OUT INT,inout_param IN OUT INT) "
+ " AS BEGIN "
+ "inout_param=in_param; "
+ "out_param=in_param;"
+ " END TEST_PRO1; ";
stmt = con.createStatement();
stmt.execute(sql);
stmt.close();
// 调用存储过程
cstmt = con.prepareCall("{call TEST_PRO1(?,?,?)}");
cstmt.setInt(1, 2);
cstmt.registerOutParameter(2, java.sql.Types.INTEGER);
cstmt.registerOutParameter(3, java.sql.Types.INTEGER);
cstmt.setInt(3, 20);
cstmt.execute();
int v2 = cstmt.getInt(2);
int v3 = cstmt.getInt(3);
assertEquals(2, v2);
assertEquals(2, v3);
cstmt.close();
} catch (SQLException e) {
fail(e.getMessage());
}