sql >> Databáze >  >> RDS >> PostgreSQL

Obsluha BatchUpdateException pomocí withBatch

Podařilo se mi to vyřešit pomocí příspěvku uvedeného v komentáři Alexandros. Řešení nyní vypadá takto:

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

Uvědomte si, že toto je vyřešeno postgresql dialektem SQL. Pro jiné DBMS může být užitečný přístup použít SQL proceduru v metodě withBatch.

Pokud někdo zná způsob, jak toho dosáhnout pomocí standardního SQL, dejte mi prosím nápovědu.




  1. Jak zapíšu uloženou proceduru, která přidá sloupec do referenčního kurzoru z jiné uložené procedury?

  2. Jak zachytit DB-požadavky? (MySQL)

  3. Jak odstranit heslo z databáze v Accessu 2016

  4. Spusťte soubor .sql v Pythonu s MySQLdb