Многорядная вставка в Redshift с использованием jdbc - PullRequest
0 голосов
/ 21 апреля 2020

Я хочу сгенерировать многорядную вставку sql в Redshift. Согласно документации, это эффективный способ сделать это: https://docs.aws.amazon.com/redshift/latest/dg/c_best-practices-multi-row-inserts.html

insert into category_stage values
(default, default, default, default),
(20, default, 'Country', default),
(21, 'Concerts', 'Rock', default);

Я занимаюсь разработкой в ​​Kotlin и использую jdb c.

Сейчас я делаю оператор create и вручную генерирую строки значения, создавая StringBuilder и добавляя их. Я делаю что-то похожее на это:

private fun mapToSQl(categoryStage: CategoryState): String {
    val stringBuilder = StringBuilder("(")
    stringBuilder.append(categoryStage.id)
    stringBuilder.append(",")
    stringBuilder.append("'" + categoryStage.category + "'")
    stringBuilder.append(",")
    stringBuilder.append("'" + categoryStage.style + "'")
    stringBuilder.append(",")
    stringBuilder.append("'" + categoryStage.place + "'")
    stringBuilder.append(");")
}

private fun generateSql(stages: CategoryStage): String {
   return stages.map { 
        mapToSQl(it)
    }.joinToString{
       prefix = "insert into category_stage values",
       postfix = ";",
       separator = ","
    }
}

Я знаю, что мой код уязвим для инъекции SQL, но я не смог сгенерировать этот запрос с PrepareStatement.

Вот код, который я использую:

 val dataSource = jdbcTemplate.dataSource
 val connection = dataSource?.connection

 val createStatement = connection!!.createStatement()
 bulkInsert = generateSql(stages)
 createStatement.addBatch(bulkInsert)     
 createStatement.executeBatch()

Буду признателен за любую помощь.

...