使用 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 中插入数组的主要内容,如果未能解决你的问题,请参考以下文章

使用XSJS将映像插入SAP HANA表

sql 插入TQuery hana

使用语句在表中插入java字节数组

java ArrayList数组中如何插入一个元素

字符数组 C 中的字符插入

java ArrayList数组中如何插入一个元素