2011-02-08 2 views
-1

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

ответ

1

Если я правильно понял, что вы хотите, и будет, вставьте только новые записи из 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) Использование материализованных представлений & мв особенность журнала. Это немного сложнее, и я предлагаю изучить документацию оракула или некоторые другие ресурсы, если вы не знакомы с ним.

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

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

0

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

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

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.

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