命名参数和缺省参数¶
神通数据库系统支持在存储过程中使用命名参数(named parameters),参数名和参数序号(parameter index)一样可以用于指定输入参数和注册输出参数。 这种用法对于存储过程有的参数具有缺省值的情况下提供了便利, 用户可以使用参数名仅仅指定没有缺省参数值的参数。 比如存储过程Test_PROC3的定义有5个输入参数, 只有名为Param1、Param5的两个参数没有缺省值, 如果其他三个参数都使用缺省参数值,则可以如下处理:
try {
String sql;
// 创建存储过程
sql = "CREATE OR REPLACE PROCEDURE TEST_PROC3"
+ "(in_param1 IN INT,in_param2 IN INT :=2,in_param3 IN INT :=3,in_param4 IN INT :=4,in_param5 IN INT) "
+ " AS BEGIN "
+ "INSERT INTO TEMP VALUES(1,'shentong');"
+ " END TEST_PROC3; ";
stmt = con.createStatement();
stmt.execute(sql);
// 调用存储过程
cstmt = con.prepareCall("{call TEST_PROC3(?,?)}");
cstmt.setInt("in_param1", 1);
cstmt.setInt("in_param5", 5);
cstmt.execute();
stmt.close();
cstmt.close();
} catch (SQLException e) {
fail(e.getMessage());
}
同样的,对于OUT参数也一样可以使用参数名注册,例如:
try {
String sql;
stmt = con.createStatement();
// 插入数据
sql = "INSERT INTO TEMP VALUES(3,'shentong')";
stmt.executeUpdate(sql);
// 创建存储过程
sql = "CREATE OR REPLACE PROCEDURE TEST_PRO4"
+ "(out_param1 OUT INT,out_param2 OUT VARCHAR(255)) "
+ " AS BEGIN "
+ "SELECT ID INTO out_param1 FROM TEMP WHERE ID=1;"
+ "SELECT NAME INTO out_param2 FROM TEMP WHERE ID=1;"
+ " END TEST_PRO4; ";
stmt.execute(sql);
// 调用存储过程
cstmt = con.prepareCall("{call TEST_PRO4(?,?)}");
cstmt.registerOutParameter("out_param1", java.sql.Types. INTEGER);
cstmt.registerOutParameter("out_param2", java.sql.Types.VARCHAR);
cstmt.execute();
assertEquals(1, cstmt.getInt(1));
assertEquals("shentong", cstmt.getString(2));
stmt.close();
cstmt.close();
} catch (SQLException e) {
fail(e.getMessage());
}
针对CallableStatement对象的参数做如下几点说明:
按照JDBC 3.0 Specification的规定,当指定一个CallableStatement对象的多个输入参数时, 不能既使用参数名,又混用参数序号,否则将导致SQLException异常被抛出。
如果用户希望获得存储过程的返回结果,即使用"{? = call 过程名[(?, ?,...)]}"的形式 来创建CallableStatement对象,则通过调用 CallableStatement.getXXX方法来获得存储过程返回结果, get方法的参数为参数序号1。
对于有缺省参数值的存储过程,创建相应的CallableStatement对象分为两种情况: 要么对所有的参数(包括有缺省值和没有缺省值的)全部用“?”占位符列出并随后指定其值; 要么仅仅用“?”占位符完整列出没有缺省值的参数并指定其值。如果对有缺省值的参数部分列出, 会导致歧义,服务器端会报错。
返回的OUT 参数中的值可能会是 JDBC NULL。当出现这种情形时,将对 JDBC NULL 值进行转换以使 getXXX 方法所返回的值为 null、0 或 false,这取决于getXXX 方法类型。要知道 0 或 false 是否源于 JDBCNULL 的唯一方法,是用方法 wasNull 进行检测。如果 getXXX 方法读取的最后一个值是 JDBC NULL,则该方法返回 true,否则返回 false。