从QueryChangeDescription获取RowId

时间:2014-07-11 14:07:31

标签: java oracle

在我的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);
  }
}
  1. tabelChangeDescription为空
  2. 我的结果是:
  3.   

    查询ID = 201,查询更改事件类型= QUERYCHANGE        表更改说明(长度= 1):operation = [UPDATE],tableName = USER.TABLE,objectNumber = 67385       行更改说明(长度= 1):         ROW:operation = UPDATE,ROWID = AAAQc5AAHAAAAG / AAB

    除了String-Parsing之外,还有什么方法可以从Changes行获取ROWID吗?我无法在getRowId上找到任何QueryChangeDescription - 方法。

1 个答案:

答案 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());
  }
}