2015-06-23 2 views
0

Мне нужно сделать C-приложение с OCI, которое извлекает новые строки из базы данных, я имею в виду: строки, добавленные во времени от последнего сеанса до текущего. ora_rowscn не является решением: это значение изменяется для блоков, так что несколько разных строк могут иметь один и тот же SCN.OCI получить только новые строки из Oracle по timestamp

На примере я таблицу с датами:

  • 03.05.2015
  • 05.05.2015
  • 07.05.2015

я могу сделать структуру:

struct Bounds { 
    Timestamp start, end; 
}; 

03.05.2015 - это начало и 07.05.2015 как конец.

Проверка строк после Bounds.end прост. Но это может быть какая-то задержка или транзакция после моего последнего запроса, и я могу иметь новые значения.

  • 03.05.2015
  • 04.05.2015
  • 05.05.2015
  • 06.05.2015
  • 07.05.2015

рассчитывать можно обнаружить Эти новые строки по запросу (STARD и END - значения структуры):

select count(*) from logs where log_time > START and log_time < END 

Тогда у меня есть 3 ряда и 5 после него. Мое приложение прочитало только чтение.

ответ

1

База данных Oracle - это одновременная среда. Так что вообще не существует способа узнать, что такое «последняя» вставленная строка, потому что технически нет последней вставленной строки.

AFAIK у вас есть два варианта

  • Используйте Continuous Query Notification. Это обходит интерфейс SQL-запросов и использует специальный API, предназначенный для этой конкретной цели.

  • Другой вариант - запросить текущие базы данных SCN и начать транзакцию с помощью этого SCN. См. OCIStmtExecute, эта функция имеет два параметра snap_in/snap_out. Теоретически вы можете использовать их для отслеживания вашего просмотра в базах данных SCN. Но я не уверен, что никогда не использовал это.

В Oracle читатели не блокируют авторов и наоборот. Таким образом, строка, вставленная 06.05.2015 (но забронированная 08.05.2015), будет видна ПОСЛЕ 7.5.2015. Oracle - это параллельная база данных, и она не гарантирует сериализации.

Возможно, если вы использовали row level ora_rowsncn, тогда это сработает. Но для этого требуется переопределение исходной таблицы.

+0

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

+0

Даже репликация master-slave не является тривиальной. С каждой версией Oracle предлагает новую технологию для этой цели. Каждый из них должен быть настроен при взаимодействии с администраторами баз данных. «ROW DEPENDENCIES» - это инкрементное значение - если оно было настроено на столе. – ibre5041

Смежные вопросы