INOUT参数

既支持输入又接受输出的参数(INOUT 参数)除了调用 registerOutParameter 方法外,还要求调用适当的 setXXX 方法(该方法是从 PreparedStatement 继承来的)。setXXX 方法将参数值设置为输入参数,而 registerOutParameter 方法将它的JDBC 类型注册为输出参数。setXXX 方法提供一个 Java类型的值,而驱动程序先把这个值转换为JDBC类型的值,然后将它送到数据服务器端。然后,要检索输出值,就要用对应的 getXXX 方法。例如,Java 类型为int的参数应该使用方法 setByte 来赋输入值。应该给registerOutParameter 提供类型为 INTEGER 的 JDBC 类型,同时应使用 getInt() 来检索输出值。

下面是一个示例:

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