oracle数据库中自定义了一个array类型的数组作为存储过程的输入参数,请问nutzdao怎么注册这种参数用传统的springjdbctemplate
jdbcCall.declareParameters(new SqlParameter("p_array", OracleTypes.ARRAY, receipt_list));是这样的,请问nutz怎么处理?有例子可以
参考吗
问答
oracle数据库自定义了一个array类型的数组作为存储过程的输入参数,请问nutzdao怎么注册这种参数
标签:
无
13 回复
Sql sql = Sqls.create("CALL sp_update_user_role(@p_user_id, @p_role_ids,@OUTp_ret)");
sql.setValueAdaptor("p_role_ids", new OracleStrArrayAdaptor());
sql.params().set("p_user_id", userId); // 设置入参
sql.params().set("p_role_ids", roleIds);
sql.params().set("OUTp_ret", Types.INTEGER);//
但是ValueAdaptor的实现类的set方法的第二个参数Obj得到的值完全不是roleIds传过来的值,跟踪调试过了传的是字符串数组,
obj的值是一个完全跟这个数组不相关的一个字符串
set(PreparedStatement stat, Object obj, int i)
这个是ValueAdaptor的实现类的set方法
public void set(PreparedStatement stat, Object obj, int i) throws SQLException {
String[] strArr = null;
if(obj==null) {
strArr = new String[0];
}
String typeName = "ARRAY_VARCHAR";
Array array = stat.getConnection().createArrayOf(typeName, (String[])obj);
stat.setObject(i, array, Types.ARRAY);
}
试了一下, 传数组会有问题, 可以先用List<String>
来规避. 下面是我的测试代码
@Test
public void test_issue_xxx() {
final Object[] re = new Object[1];
ValueAdaptor va = new ValueAdaptor() {
@Override
public void set(PreparedStatement stat, Object obj, int index) throws SQLException {
re[0] = obj;
stat.setString(index, "ABC");
}
@Override
public Object get(ResultSet rs, String colName) throws SQLException {
// TODO Auto-generated method stub
return null;
}
};
List<String> name = Arrays.asList("wendal");
Sql sql = Sqls.create("select * from t_pet where name=@name");
sql.setParam("name", name);
sql.setValueAdaptor("name", va);
dao.execute(sql);
assertEquals(name, re[0]);
}
嗯,刚刚你的这个的确能从ValueAdapter里拿到数组了,另外对于oracle相关的自定义类型,要这样写才能用
Connection conn = stat.getConnection().getMetaData().getConnection();
ArrayDescriptor ARRAY_NUM = ArrayDescriptor.createDescriptor("ARRAY_VARCHAR", conn);
java.sql.Array arr = new oracle.sql.ARRAY(ARRAY_NUM, conn, strArr);
// Array array = stat.getConnection().createArrayOf(typeName,strings);
stat.setObject(i, arr, Types.ARRAY);
现在问题已经解决了;
添加回复
请先登陆