使用 JAVA 在 HANA 中插入数组
Posted
技术标签:
【中文标题】使用 JAVA 在 HANA 中插入数组【英文标题】:Insert array in HANA with JAVA 【发布时间】:2017-06-08 16:11:34 【问题描述】:我有一个对象数组列表并尝试将列表插入 HANA。所以我的插入代码看起来像
PreparedStatement stmt = conn
.prepareStatement("INSERT INTO SCHEMA.TABLE VALUES"
+ " (?, ?, ?, ?, ?, ?, ?, ARRAY("+"1,2,3"+")");
for (int i = 1; i <= ITERATION_MAX; i++)
stmt.setInt(1, listofdata.get(i).get_id());
stmt.setInt(2, listofdata.get(i).get_name());
stmt.setInt(3, listofdata.get(i).get_place());
stmt.setInt(4, listofdata.get(i).get_year());
stmt.setInt(5, listofdata.get(i).get_day());
stmt.setInt(6, listofdata.get(i).get_rollno());
stmt.setInt(7, listofdata.get(i).get_main_subject());
stmt.setArray(8, listofdata.get(i).get_elective());
stmt.addBatch();
stmt.executeBatch();
这里listofdata.get(i).get_elective()
返回一个整数数组。
但这不起作用。根据我的程序,每次都会调用 ARRAY 函数,但为什么它不插入 HANA 数据库。所以过了一会儿我明白我必须将 JAVA 数组转换为 HANA 数组。我该如何转换一个 java 数组到 HANA 数组。 任何帮助表示赞赏。
【问题讨论】:
查看link 这是我们在***.com/questions/41677436/… 中讨论的迭代。请按照我在此处发布的 SO 链接进行操作。 如果是元素,您将不得不遍历数组并构造一个 ARRAY (.., ... ,... ) 函数。这必须为您要插入的每个数组显式完成。在***.com/questions/40102034/… 中,我举了一个例子来说明这在 SQLScript 中是如何工作的(场景略有不同,但你应该了解它的要点)。 不,我还没有准备好。现在具体有什么不清楚的?对于插入语句,您必须创建一个类似于 INSERT INTO... (1, 'bla', 10-12-2016,... ARRAY( ....,...,...) ) 的字符串.这都是标准。只需用 java 数组的每个元素填充数组函数即可。 正确,对于每个 ARRAY 长度,您都需要一个单独的 INSERT 语句。 【参考方案1】:@RKR 好的,这里有你的例子:
/*
* We're goin to insert several arrays into the HANA table,
* with different lengths
*
* let's assume we already got a table like this
* CREATE COLUMN TABLE T3 ( ID INT PRIMARY KEY, C1 INT ARRAY );
*/
Integer[][] myarr = 1, 1,2, 1,2,3,4,5, 1,2, 1,2,3 ;
String testSection = "Insert Arrays one by one";
stopWatch.start(testSection);
myDBconn.setAutoCommit(false);
Statement stmt = myDBconn.createStatement();
stmt = myDBconn.createStatement();
stmt.execute("TRUNCATE TABLE DEVDUDE.T3");
// loop over our array of arrays and visit each once
for (int i = 0 ; i < (myarr.length); i++)
int curr_length = myarr[i].length;
String arrayFunction = "ARRAY (";
for (int j = 0; j < (curr_length); j++)
arrayFunction = arrayFunction.concat(myarr[i][j].toString()) ;
// add comma if this is not the last element
if (j < (curr_length - 1))
arrayFunction = arrayFunction.concat(", ") ;
arrayFunction = arrayFunction + ")" ;
// now the arrayFunction should loook like this
// ARRAY ( ..., .... ,... )
String insCMD = "INSERT INTO T3 (id, c1) "
+ " VALUES (" + i + ", "
+ arrayFunction
+ " ) ";
System.out.println(insCMD);
int affectedRows = stmt.executeUpdate(insCMD);
System.out.println("Loop round " + i
+ ", last affected row count " + affectedRows);
myDBconn.commit();
stmt.close();
stmt = null;
不,此代码确实不清理 INSERT 语句的输入,但必须这样做以避免 SQL 注入。
当我运行代码时,这就是打印出来的内容:
INSERT INTO T3 (id, c1) VALUES (0, ARRAY (1) )
Loop round 0, last affected row count 1
INSERT INTO T3 (id, c1) VALUES (1, ARRAY (1, 2) )
Loop round 1, last affected row count 1
INSERT INTO T3 (id, c1) VALUES (2, ARRAY (1, 2, 3, 4, 5) )
Loop round 2, last affected row count 1
INSERT INTO T3 (id, c1) VALUES (3, ARRAY (1, 2) )
Loop round 3, last affected row count 1
INSERT INTO T3 (id, c1) VALUES (4, ARRAY (1, 2, 3) )
Loop round 4, last affected row count 1
然后表上的 SELECT 返回:
ID C1
0 1
1 1, 2
2 1, 2, 3, 4, 5
3 1, 2
4 1, 2, 3
【讨论】:
最后我也想通了。几乎和你的一样,但你做的更正式,我通过Arrays.toString(arr)
将整个数组转换为字符串,并与` ""++" "` 连接。确实您的方法更标准,对于正在寻找相同解决方案的其他人也很有用。非常感谢您对代码进行清晰的解释【参考方案2】:
这不是标准代码,但仍然可以正常工作。希望它可以帮助任何人。
for (int i = 1; i <= ITERATION_MAX; i++)
String arraylist=Arrays.toString(listofdata.get(i).get_arraylist.replace("[","").replace("]",""));
id=listofdata.get(i).get_id();
name= listofdata.get(i).get_name();
place=listofdata.get(i).get_place();
year= listofdata.get(i).get_year();
day=listofdata.get(i).get_day();
rollno= listofdata.get(i).get_rollno();
main_subject= listofdata.get(i).get_main_subject();
elective= listofdata.get(i).get_elective();
Statement stmt = conn.createStatement();
String sql="INSERT INTO SCHEMA.TABLE values("+
+name+","
place+","
year+day+","
rollno+","
main_subject+","
elective"+","
"ARRAY("+arraylist+")" ;
stmt.addbatch(sql);
stmt.executeBatch();
stmt.close();
conn.commit();
conn.close();
【讨论】:
@Lars Br.上面的代码对我来说很好用,但是只加载 100 万行(即使是批量插入)需要将近 1 个小时,我觉得这不是很令人印象深刻。这可以解决吗?以上是关于使用 JAVA 在 HANA 中插入数组的主要内容,如果未能解决你的问题,请参考以下文章