PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Obsługa wyjątku BatchUpdateException przy użyciu withBatch

Udało mi się rozwiązać ten problem z postem wspomnianym w komentarzu Alexandrosa. Rozwiązanie wygląda teraz tak:

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()
}

Należy pamiętać, że jest to rozwiązane za pomocą dialektu postgresql języka SQL. W przypadku innych DBMS przydatnym podejściem może być użycie procedury SQL w metodzie withBatch.

Jeśli ktoś zna sposób na zrobienie tego za pomocą standardowego SQL, proszę o wskazówkę.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zwraca RDSdataService execute_statement (BadRequestException)

  2. Czy typ danych Postgres NUMERIC może przechowywać podpisane wartości?

  3. Tworzenie bazy danych postgresql przy użyciu psycopg2

  4. Jak zrobić system budowania dla PostgreSQL

  5. Aplikacja Spring Boot. Batch nie działa w metodzie JpaRepository.saveAll