NutzCN Logo
问答 oracle数据库自定义了一个array类型的数组作为存储过程的输入参数,请问nutzdao怎么注册这种参数
发布于 2449天前 作者 daren990 1877 次浏览 复制 上一个帖子 下一个帖子
标签:

oracle数据库中自定义了一个array类型的数组作为存储过程的输入参数,请问nutzdao怎么注册这种参数用传统的springjdbctemplate
jdbcCall.declareParameters(new SqlParameter("p_array", OracleTypes.ARRAY, receipt_list));是这样的,请问nutz怎么处理?有例子可以
参考吗

13 回复

需要映射到Pojo的属性吗?

Sql sql = Sqls.create("xxxx");
sql.setValueAdaptor("字段名", 自定义ValueAdaptor实现);

           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)

roleIds 原本是什么类型

是一个String[] 数组

nutz版本是多少

这个是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);

}

nutz的版本是1.r.66-SNAPSHOT

试了一下, 传数组会有问题, 可以先用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);  

现在问题已经解决了;

我担心直接通过这种方式拿到这个conn,会不会导致conn不会被释放;还需要观察下;

这个conn会自动释放的

添加回复
请先登陆
回到顶部