我有一个包含String列“ key1”,“ col1”,“ col2”,“ col3”的表。我下面有一个代码片段来测试批量插入。运行它时,我没有收到任何错误,但没有看到对“测试”表的任何更改。
我错过了什么吗?
Object[][] data = new Object[4][];
ArrayList<String>[] rec = new ArrayList[4];
rec[0] = new ArrayList<String>();
rec[1] = new ArrayList<String>();
rec[2] = new ArrayList<String>();
rec[3] = new ArrayList<String>();
for (Integer i = 0; i < 10; i++) {
rec[0].add(i.toString() + i.toString() + i.toString());
rec[1].add(i.toString() + i.toString() + i.toString());
rec[2].add(i.toString() + i.toString() + i.toString());
rec[3].add(i.toString() + i.toString() + i.toString());
}
for (int i = 0; i < 4; i++) {
data[i] = rec[i].toArray(new Object[rec[i].size()]);
}
c.Dict dict = new c.Dict(Arrays.asList("key1", "col1", "col2", "col3").toArray(new String[4]), data);
c.Flip flip = new c.Flip(dict);
Object[] updStatement = new Object[] { ".u.upd", "test", flip };
conn.ks(updStatement);
答案 0 :(得分:2)
添加您要说的内容后,您想使用ks() method with 2 arguments。
从c.java class中给出的javadoc:
使用它来 *在kdb +中调用一个函数,该函数带有2个参数并且不返回值。例如调用f [x; y]使用ks(“ f”,x,y); *要调用lambda,请使用ks(“ {x + y}”,x,y);
函数.u.upd
接受2个参数,默认情况下,其签名与insert相同:
第二个参数中Object []的长度应等于列数。 Object []中的每个Object本身都应是一个长度等于记录数的数组。内部数组的顺序应与列的顺序相同,并且每个内部数组的值应与kdb中的列类型具有matching type并与记录相同。
您的对象[]应该看起来像:
new Object[]{
new Object[]{row1col1, row2col1, /*..., */ rowNcol1},
new Object[]{row1col2, row2col2, /*..., */ rowNcol2},
/* column 3 to column N-1 values */
new Object[]{row1colN, row2colN, /*..., */ rowNcolN}
}
您的ks()
方法调用应类似于:
conn.ks(".u.upd", "test", new Object[]{ /*.... */});