plsql - обогащение таблицы по данным чужой таблицы - PullRequest
0 голосов
/ 08 февраля 2011

Предположим, что таблица «Источник» заполнена данными каждый час с процедурой на месте. Я хочу запустить процедуру, которая будет заполнять мою новую таблицу 'NEW' ТОЛЬКО новыми строками целевой таблицы SOURCE при каждом запуске профи, учитывая, что новая таблица ДОЛЖНА всегда сохранять все время уже вставленные данные ( Я имею в виду, что решение каждый раз, когда процесс вставлять в ... NEW, а затем вставлять во временную таблицу различные значения, удалять NEW, вставлять из временного файла и т. д., не помогает).

Ответы [ 2 ]

1 голос
/ 08 февраля 2011

Если бы я понял, что вы хотите, и вставил бы только новые записи из SOURCE в NEW, существует множество способов сделать это. Вот некоторые из них:

1) Создайте триггер на SOURCE, который автоматически вставляется в NEW, чтобы вам не о чем беспокоиться.

2) Используйте оператор как этот, чтобы выбрать только новые строки из SOURCE. Предполагается, что первичные ключи одинаковы для обеих таблиц.

INSERT INTO NEW
SELECT * FROM SOURCE s1 WHERE NOT EXISTS (SELECT 1 FROM NEW n1 WHERE n1.key=s1.key)

3) Использовать материализованный вид и функцию регистрации в mv. Это немного сложно, и я предлагаю изучить документацию оракула или некоторые другие ресурсы, если вы не знакомы с ним.

4) Измените процедуру, которая вставляется в SOURCE, чтобы также вставлять в NEW.

Конечно, вы должны выяснить, что делать, если есть возможные обновления на SOURCE. Я могу объяснить эти методы подробно, если хотите.

0 голосов
/ 11 мая 2011

Проголосовал за решение Дсмоляновича.Одна из причин, почему процедурное решение (с временными метками или последовательностями) не подходит для этого, - это незафиксированные данные.

Возьмем пример:

At 02:55:00: 75 rows are added to SOURCE and are timestamped '02:55:00'
At 02:55:30: The 75 row insert is committed
At 02:59:55: 100 rows are added to SOURCE and are timestamped '02:59:55'
At 03:00:00: Your process kicks off and selects from source
At 03:00:20: The 100 row insert is committed

Процесс не увидит эти 100 строк(поскольку они не зафиксированы), и при следующем запуске он может пропустить их, если будет искать строки с метками времени после 03: 00: 00.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...