在我的Oracle数据库中,我已经使用SQL查询注册了DatabaseChangeNotification
。我希望对定义的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);
}
}
tabelChangeDescription
为空查询ID = 201,查询更改事件类型= QUERYCHANGE 表更改说明(长度= 1):operation = [UPDATE],tableName = USER.TABLE,objectNumber = 67385 行更改说明(长度= 1): ROW:operation = UPDATE,ROWID = AAAQc5AAHAAAAG / AAB
除了String-Parsing之外,还有什么方法可以从Changes行获取ROWID吗?我无法在getRowId
上找到任何QueryChangeDescription
- 方法。
答案 0 :(得分:2)
我发现是获得RowId。从queryChangeDescription
开始,您可以从事件中获得与TableChangeDecription无关的TabeleChangeDesciptions
。如果多个表上有更改,则这些表在Array中列出。
因为我只注册了一个表,所以我不必遍历列表。
在对TableChangeDescription
进行操作后,您可以为每个更改的行获取RowChangeDescription
。从这里你可以获得RowId。
for (QueryChangeDescription queryChangeDescription : databaseChangeEvent.getQueryChangeDescription()) {
RowChangeDescription[] rowChangeDescriptions = queryChangeDescription.getTableChangeDescription()[0].getRowChangeDescription();
for (RowChangeDescription rowChangeDescription : rowChangeDescriptions) {
handleEvent(rowChangeDescription.getRowid());
}
}