private void doUpdate(SourceRecord record) throws SQLException {

        String sinkTableName = mappingSourceSinkTables.get(getSourceTableName(record).toLowerCase());
        String[] pks = getSourcePrimaryKeys(record);
        List<String> columns = getColumns(record);

        if (batchPS == null) {
            StringBuilder sqlCmd = new StringBuilder();
            sqlCmd.append("UPDATE " + sinkTableName + " SET ");

            for (int i = 0; i <= columns.size() - 1; i++) {
                if (i > 0) sqlCmd.append(",");
                sqlCmd.append(columns.get(i)).append("=?");
            }
            sqlCmd.append(" WHERE ");
            for (int i = 0; i <= pks.length - 1; i++) {
                if (i > 0) sqlCmd.append(" AND ");
                sqlCmd.append(pks[i].toLowerCase()).append("=?");
            }

            LOG.info("Updating record with " + sqlCmd);
            batchPS = this.getConnection().prepareStatement(String.valueOf(sqlCmd));
        }

        // Binding values to the statement
        Struct value = ((Struct) record.value()).getStruct("after");
        // SET values
        bindValuesToBatchPS(value);
        int psIndex = columns.size() + 1;
        // WHERE values
        for (int i = 0; i <= pks.length - 1; i++) {
            try {
                batchPS.setObject(psIndex, value.get(pks[i]));
            } catch (DataException e) {
                try {
                    batchPS.setObject(psIndex, value.get(pks[i].toLowerCase()));
                } catch (DataException ex) {
                    batchPS.setObject(psIndex, value.get(pks[i].toUpperCase()));
                }
            }
            psIndex++;
        }
        batchPS.addBatch();
    }
Constructs the SqlManager.

@param opts   the ReplicaDB ToolOptions describing the user's requested action.
@param dsType
src/main/java/org/replicadb/manager/cdc/OracleManagerCDC.java