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());
		}