Получить RowId из QueryChangeDescription

1

В мою базу данных Oracle я зарегистрировал DatabaseChangeNotification с SQL-Query. Мне нравится получать какие-либо изменения в определенном TABLE.

DatabaseChangeRegistration changeRegistration;

Properties properties = new Properties();
properties.setProperty(OracleConnection.DCN_NOTIFY_ROWIDS, "true");
properties.setProperty(OracleConnection.DCN_QUERY_CHANGE_NOTIFICATION, "true")

changeRegistration = connection.registerDatabaseChangeNotification(properties);

DCNListener dcnListener = new DCNListener(this);
changeRegistration.addListener(this);

Statement statement = connection.createStatement();
((OracleStatement) statement).setDatabaseChangeRegistration(changeRegistration);
String sql = "SELECT * from TABLE";

statement.executeQuery(sql);

В моем слушателе я получаю DatabaseChangeEvents

public void onDatabaseChangeNotification(DatabaseChangeEvent databaseChangeEvent) {
  TableChangeDescription[] tableChangeDescription = databaseChangeEvent.getTableChangeDescription();
  QueryChangeDescription[] queryChangeDescription = databaseChangeEvent.getQueryChangeDescription();
  for (QueryChangeDescription qcd: queryChangeDescription) {
    String result = qcd.toString();
    System.out.println(qcd);
  }
}
  1. tabelChangeDescription - null
  2. Мой результат:

query ID = 201, тип события изменения запроса = QUERYCHANGE Таблица Изменение Описание (length = 1): operation = [UPDATE], tableName = USER.TABLE, objectNumber = 67385 Row Change Description (length = 1): ROW: operation = UPDATE, ROWID = AAAQc5AAHAAAAG/AAB

Есть ли хороший способ получить ROWID из строки "Изменения", кроме String-Parsing? Я не могу найти getRowId -Method в QueryChangeDescription.

Теги:

1 ответ

2
Лучший ответ

Я нашел, что должен был получить RowId. Из queryChangeDescription вы можете получить TabeleChangeDesciptions который не имеет ничего общего с TableChangeDecription от события. Если в более чем одной таблице есть изменения, эти таблицы перечислены в массиве. Поскольку я зарегистрирован только для одной таблицы, мне не нужно перебирать список.

После использования TableChangeDescription вы можете получить RowChangeDescription для каждой измененной строки. Из этого вы можете получить RowId.

for (QueryChangeDescription queryChangeDescription : databaseChangeEvent.getQueryChangeDescription()) {
  RowChangeDescription[] rowChangeDescriptions = queryChangeDescription.getTableChangeDescription()[0].getRowChangeDescription();
  for (RowChangeDescription rowChangeDescription : rowChangeDescriptions) {
    handleEvent(rowChangeDescription.getRowid());
  }
}
  • 0
    У меня та же проблема, и я последовал вашему ответу, но я получаю сообщение об ошибке в queryChangeDescription.getTableChangeDescription()[0] Не удается найти метод getTableChangeDescription() Пожалуйста, помогите!
  • 0
    @kittu у вас есть «oracle.jdbc.dcn.QueryChangeDescription»? Я обновил свой ответ всем своим фрагментом.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню