PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Gestione di BatchUpdateException utilizzando withBatch

Sono stato in grado di risolvere questo problema con il post menzionato nel commento di Alexandros. La soluzione ora si presenta così:

sql.withTransaction {
    try {
        sql.withBatch(1000, 'insert into category (id, version, name, parent_id) ' +
        'select :id, :version, :name, :parent_id ' +
        'where not exists (select name, parent_id from category where name = :name and parent_id = :parent_id);') { stmt ->
            categoryInserts.each {
                try {
                    stmt.addBatch([id: it.id, version: 0, name: it.name, parent_id: it.parent?.id])
                } catch (SQLException e) {
                  log.error("Category ${it.name} with parent ${it.parent?.id} could not be inserted.")
                }
            }
        }
    } catch (BatchUpdateException e) {
        log.error("Categories could not be inserted.", e)
    }

    sql.commit()
}

Tieni presente che questo è risolto con il dialetto postgresql di SQL. Per altri DBMS potrebbe essere un approccio utile utilizzare una procedura SQL nel metodo withBatch.

Se qualcuno conosce un modo per farlo con un SQL standard, per favore dammi un suggerimento.