Чтобы получить курсор, вы не можете использовать compiledStatement. Однако, если вы хотите использовать полностью подготовленный оператор SQL, я рекомендую адаптировать метод jbaez ... Используя db.rawQuery()
вместо db.query()
.
Поскольку вы используете 10g, вы можете использовать псевдостолбец ORA_ROWSCN
. Это дает вам верхнюю границу последнего SCN (номер изменения системы), который вызвал изменение в строке. Поскольку это возрастающая последовательность, вы можете сохранить максимум ORA_ROWSCN
, который вы видели, а затем искать только данные с SCN больше этого
По умолчанию ORA_ROWSCN
фактически поддерживается на уровне блока, поэтому изменение любой строки в блоке изменит ORA_ROWSCN
для всех строк в блоке. Этого, вероятно, вполне достаточно, если целью является минимизация количества обрабатываемых строк несколько раз без изменений, если мы говорим о «нормальных» шаблонах доступа к данным. Вы можете перестроить таблицу с помощью ROWDEPENDENCIES
, что приведет к отслеживанию ORA_ROWSCN
на уровне строк, что дает вам более детальную информацию, но требует одноразовых усилий для перестройки таблицы.
Другой вариант - настроить что-то вроде Change Data Capture (CDC) и сделать ваше приложение OCI подписчиком изменений в таблице, но это также требует единовременных усилий по настройке CDC.
Я действительно опоздал на эту вечеринку, но вот как я это сделал:
SELECT SCN_TO_TIMESTAMP(MAX(ora_rowscn)) from myTable;
Это достаточно близко для моих целей.
Если аудит включен на сервере, просто используйте
SELECT *
FROM ALL_TAB_MODIFICATIONS
WHERE TABLE_NAME IN ()
Спросите своего администратора базы данных об аудите. Он может начать аудит с помощью простой команды, например:
AUDIT INSERT ON user.table
Затем вы можете запросить таблицу USER_AUDIT_OBJECT, чтобы определить, была ли вставка в вашу таблицу с момента последнего экспорта.
Google для Oracle аудита для получения дополнительной информации ...
Пожалуйста, используйте приведенное ниже утверждение
select * from all_objects ao where ao.OBJECT_TYPE = 'TABLE' and ao.OWNER = 'YOUR_SCHEMA_NAME'
Вам нужно будет добавить триггер при вставке, обновлении, удалении, который устанавливает значение в другой таблице для sysdate.
Когда вы запускаете приложение, оно считывает значение и сохраняет его где-нибудь, чтобы при следующем запуске оно имело ссылку для сравнения.
Считаете ли вы, что «Special Admin Stuff»?
Было бы лучше описать, что вы на самом деле делаете, чтобы получить более четкие ответы.
Oracle может наблюдать за изменениями в таблицах, а при их изменении может выполнять функцию обратного вызова в PL / SQL или OCI. Обратный вызов получает объект, который представляет собой набор таблиц, которые изменились, и который содержит коллекцию измененных строк и тип действия, Ins, upd, del.
Так что ты даже не идешь к столу, ты сидишь и ждешь вызова. Вы пойдете, только если есть изменения, чтобы написать.
Это называется Уведомление об изменении базы данных . Как упоминал Джастин, это намного проще, чем CDC, но оба требуют некоторой фантазии администратора. Хорошая часть заключается в том, что ни один из них не требует изменений в заявке.
Предостережение заключается в том, что CDC подходит для больших таблиц, а DCN - нет.
Если кто-то еще ищет ответ, он может использовать функцию уведомления об изменении базы данных Oracle , поставляемую с Oracle 10g. Требуется CHANGE NOTIFICATION
системная привилегия. Вы можете зарегистрировать слушателей, когда вызывать уведомление обратно в приложение.
Сколько времени занимает пакетный процесс для записи файла? Возможно, проще всего позволить ему пойти дальше, а затем сравнить файл с копией файла из предыдущего прогона, чтобы убедиться, что они идентичны.
Не могли бы вы выполнить какую-либо контрольную сумму результата и сохранить ее локально? Затем, когда ваше приложение запрашивает базу данных, вы можете сравнить ее контрольную сумму и определить, следует ли ее импортировать?
Похоже, что вы можете использовать функцию ORA_HASH для этого.
Обновление: Еще один полезный ресурс: Функция 10RA ORA_HASH для определения того, равны ли данные двух таблиц Oracle