// set parameters
Collection<Parameter> parameters = sp.getParameters();
Iterator<Parameter> pit = parameters.iterator();
while(pit.hasNext()) {
Parameter p = pit.next();
if (Parameter.MODE_INOUT.equals(p.getMode()) ||
Parameter.MODE_OUT.equals(p.getMode()) ||
Parameter.MODE_RETURN.equals(p.getMode())) { //function return
cstmt.registerOutParameter(p.getIndex(), p.getSqlDataType());
}
if (Parameter.MODE_IN.equals(p.getMode()) ||
Parameter.MODE_INOUT.equals(p.getMode())) {
String key = p.getName();
if ( !inputs.containsKey(key) ) throw new Exception("There must be a key/value pair corresponding to key " + key + " in input parameters.");
Object obj = inputs.get(key);
if (obj == null ||
"".equals(obj.toString()) &&
p.getSqlDataType() != Types.CHAR &&
p.getSqlDataType() != Types.VARCHAR &&
p.getSqlDataType() != Types.LONGVARCHAR) {
setNull(cstmt, p.getIndex(), p.getSqlDataType());
}
else {
if ("oracle.sql.CLOB".equals(p.getJavaClassName())) {
String tmp = (String)obj;
int strLength = tmp.length();
StringReader r = new StringReader(tmp);
cstmt.setCharacterStream(p.getIndex(), r, strLength);
r.close();
}
else if (Parameter.UNKNOWN_SQL_DATA_TYPE != p.getSqlDataType()) {
setObject(cstmt, obj, p);
}
else {
//It is up to JDBC driver's PreparedStatement implementation
//class to deal with. Usually the class will make a decision
//on which setXXX(Type) method to call based on the type of
//the obj instance.
cstmt.setObject(p.getIndex(), obj);
}
}
}
}