Сравните две таблицы Oracle из двух разных баз данных в Java

У меня есть 2 разные базы данных. На самом деле вторая база данных содержит все записи, идентичные первой. Это означает, что когда я создаю/удаляю/обновляю любую запись в первой базе данных, через некоторое время она также отображается и во второй таблице базы данных. Хотя есть и некоторые незначительные различия, например, две строки в первой таблице отличаются или являются дополнительными.

Мой вопрос заключается в том, как сравнить эти две таблицы из двух разных баз данных в Java.

Я подключаюсь к базам данных вот так, но не знаю, как действовать дальше. Любая помощь будет оценена по достоинству

              String SQL_Statement = "SELECT * FROM Table_All_Customers";

        for (Connection con : getDBConnections())
        {

        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery(SQL_Statement);
        int count=0;
        int rowCount= 0;
        while (rs.next())
        {
            count+=1;
            rowCount+=1;
            String productNumber = rs.getString("Customer");
            System.out.println("This is the result ... " + rowCount + " :" + productNumber);
        }
    }

С помощью приведенного выше кода я просто извлекаю данные из столбцов этих таблиц и печатаю их.

таблицы выглядят так

таблица 1 в базе данных 1:

      UserID  Customer    Order    number  
----------------------
2334e3    David       Pizza    2       
2334e4    David       Cola     3       
2334e5    Lisa        Cola     4       
2334e6     Lina       Pizza    5      
2334e7    Greco       Cola     6       

таблица 1 в базе данных 2:

       UserID   Customer    Order    number  
    ----------------------  
  2334e3  David       Pizza    2       
  2334e4  David       Cola     3       
  2334e5  Lisa        Cola     4       
  2334e6  Lina        Pizza    5       

Моя цель — сравнить эти две таблицы выше, чтобы проверить, успешно ли обновляются данные в двух разных базах данных. И есть ли способ проверить различия? Как этого добиться через Java. Был бы благодарен за любую помощь.

Обновлено:

Я попробовал что-то подобное, но не могу сравнить различия. Можно ли распечатать различия между двумя таблицами?

      public static boolean isDBSame()
    {
        try
 {
        Connection con = DriverManager.getConnection(URL, userName, pass);
        Connection con2 = DriverManager.getConnection(URL2, userName, pass);
        Statement stmt = con.createStatement();
        Statement stmt2 = con2.createStatement();
        ResultSet rs = stmt.executeQuery(SQL_Statement);
        ResultSet rs2 = stmt2.executeQuery(SQL_Statement_2);
        int count = 0;
        int rowCount = 0;
        int firstDB_count = 0;
        int firstDB_rowCount = 0;
        List<String> tags = new ArrayList<String>();
        List<String> tags2 = new ArrayList<String>();
        List<String> tags3 = new ArrayList<String>();
        Set<String> ad = new HashSet<String>(tags);
        Set<String> bd = new HashSet<String>(tags2);
        while (rs.next())
        {
            String Customer = rs.getString(1);
            System.out.println("This is the content of 1st database: " + rowCount + " : " + Customer.toString());
            count += 1;
            rowCount += 1;
            tags.add(rs.getString("UserID"));
   while (rs2.next())
                {
String Customer2 = rs2.getString(1);
tags2.add(rs2.getString("CUserID"));
 }

        }
        for (String e : tags2)
        {
            System.out.println("This is the second database e.... " + e);
        }
        if (tags.equals(tags2))
        {
            System.out.println("Hi ");
            System.out.println("Content is same...");
            return true;
        }
        else
        {
            System.out.println("Content is not same and check properly....... " );
        }
    }
    catch (Exception e)
    {

        System.out.println("It is false...");
        System.out.println(e.toString());
    }
    return false;
}


       

Даже я попробовал это

      Set<String> ad = new HashSet<String>(tags);
Set<String> bd = new HashSet<String>(tags2);
ad.removeAll(bd);

Но это приводит к ложному или истинному результату. Могу ли я как-нибудь напечатать разницу между двумя списками? Также любой эффективный способ сравнить разные столбцы двух разных таблиц в двух разных базах данных.

2 ответа

Более удобный способ сделать это — иметь таблицу Orignal в вашей единственной базе данных, создать еще одну таблицу с аналогичными характеристиками, а затем сравнить их, но для вашего сценария.

Самый простой способ сделать это — создать два отдельных подключения к двум вашим базам данных одним методом, например:

          public boolean isSame(){
        try{
           Connection con = DriverManager.getConnection(URL, userName, pass);
           Connection con2 = DriverManager.getConnection(URL, userName, pass);
           Statement stmt = con.createStatement();
           Statement stmt2 = con2.createStatement();
           ResultSet rs = stmt.executeQuery(SQL_Statement);
           ResultSet rs2 = stmt2.executeQuery(SQL_Statement);
              int count=0;
              int rowCount= 0;
              while (rs.next())
              {
                 while(rs2.next()){
                      String Customer = rs.getString(1);
                      String Customer2 = rs2.getString(1);
                      if(Customer.equals(Customer2)){
                          return true;
                      }
                 }
            }
       } catch(Exception e){
            System.out.println(e.toString())
     }
     return false; 
}

Con и Con2 будут двумя отдельными соединениями для вашей базы данных, и тогда вы сможете создать для них отдельные инструкции и набор результатов. Получив значения, вы получите необходимые значения, сравните их и сможете использовать оператор && для одновременного сравнения многих, что решит вашу проблему.

Вы могли бы структурировать свой код немного лучше. Например, разбивая то, чего вы пытаетесь достичь, на логические шаги. Это работает лучше, чем разработка методом проб и ошибок:

  1. Прочтите результаты из обеих баз данных, упорядоченные по UserID.
  2. Сравните количество строк и столбцов обоих результатов и выйдите с ошибкой, если они различаются.
  3. Повторяйте оба результата одновременно, пока не появится разница или не будет достигнут конец обоих списков.
  4. В рамках итерации возьмите следующую строку из каждого результата.
  5. Перебрать столбцы обеих строк
  6. Сравните значения двух столбцов и выйдите с ошибкой, если они не равны.
  7. Достигнув конца итерации результата, выйдите с успехом.

Что-то вроде этого (непроверено):

      class DatabaseComparisonUtility {

    private ResultSet resultSet1;
    private ResultSet resultSet2;
    private int columnCount;
    private boolean equals;

    public boolean areSame(Database db1, Database db2, String query) throws Exception {
       
        equals = true;

        readResultSets(db1, db2, query);

        checkDimensions();

        while (equals && resultSet1.next() && resultSet2.next()) {
            compareRows();
        }

        return equals;
    }

    private void readResultSets(Database db1, Database db2, String query) throws Exception  {
        resultSet1 = readResultSet(db1, query);
        resultSet2 = readResultSet(db2, query);
    }

    private ResultSet readResultSet(Database db, String query) throws Exception  {
        Connection conn = DriverManager.getConnection(db.getUrl(), db.getUserName(), db.getPassword());
        Statement stmt = conn.createStatement();
        return stmt.executeQuery(query);
    }

    private void checkDimensions() {

        columnCount = getColumnCount(resultSet1):
        equals = equals && (columnCount == getColumnCount(resultSet2));

        int rowCount = getRowCount(resultSet1);
        equals = equals && (rowCount == getRowCount(resultSet2));
    }

    private int getColumnCount(ResultSet resultSet) {
         return resultSet.getMetaData().getColumnCount();
    }

    private int getRowCount(ResultSet resultSet) {
         resultSet.last();
         int rowCount = resultSet.getRow();
         resultSet.first();
         return rowCount;
    }

    private void compareRows() {
        for(int column = 1; column <= columCount; column++) {                
            equals = equals && equalColumns(column);
        }
    }

    private boolean equalColumns(int column) {       
        String value1 = resultSet1.getString(column);
        String value2 = resultSet2.getString(column);
        equals = equals && (value1.equals(value2));
    }
}

Я предполагаю, что можно сравнивать строковое представление значений вашего столбца, что должно быть приемлемо в большинстве случаев.

Такие заявления, какequals = equals && (rowCount == getRowCount(resultSet2))проверяем, что существующее значение равенства не перезаписывается. Чтобы гарантировать, что после того, как равенство станет ложным, последующие проверки не сделают его снова истинным.

ЧастьrowCount == getRowCount(resultSet2)— это логическое выражение, которое оценивается какtrueесли два rowCounts равны и ложны в противном случае.

Вам необходимо создатьDatabaseкласс самостоятельно, содержащий поля, необходимые для подключения к базе данных (url, имя пользователя, пароль).

SQL-запрос должен отсортировать строки по UserId, поэтому:

      "SELECT * FROM Table_All_Customers ORDER BY UserID"

В противном случае порядок результатов не указан, и их последовательное сравнение может оказаться неудачным.

Другие вопросы по тегам