Триггер PLSQL или любой другой способ поддерживать первичные критерии для операторов вставки - PullRequest
0 голосов
/ 29 апреля 2019

Мне нужна помощь для запуска или что-то в этом роде.

Проблема:

У меня есть таблица с "id" в качестве первичного ключа. Файл, который я получаю из стороннего приложения, содержит только операторы вставки в таблицу (генерация файлов происходит на регулярной основе). Когда я выполняю файл (Файл содержит как новые, так и существующие идентификаторы), а) запись должна быть вставлена ​​в таблицу для нового идентификатора б) удаление-вставка или обновление должно происходить для существующих идентификаторов

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Предпочтительным способом было бы изменить операторы вставки на MERGE .Однако, когда вы говорите «, который я получаю из стороннего приложения ... », тогда я предполагаю, что вы не можете их изменить.

В этом случае создайте представление из вашей таблицы, т.е.simple CREATE VIEW ... AS SELECT * FROM YOUR_TABLE;

Затем вы можете создать ab INSTEAD OF Trigger , например

CREATE OR REPLACE TRIGGER update_name_view_trigger
INSTEAD OF UPDATE OR INSERT OR DELETE ON ...
BEGIN

  IF INSERTING THEN
     MERGE INTO ... D
     USING (SELECT :new.ID, :new.x, :new.Y, :new.Z FROM dual) S
       ON (D.ID = S.ID)
     WHEN MATCHED THEN UPDATE SET ...
     WHEN NOT MATCHED THEN INSERT ...;
  ELSIF DELETING THEN
     NULL; -- do nothing for delete
  ELSIF UPDATING THEN
     UPDATE ... SET ...
     WHERE ID = :OLD.ID;
END;
0 голосов
/ 29 апреля 2019

Итак, у вас есть скрипт, который содержит INSERT операторы, но только новые данные должны быть ВСТАВЛЕНЫ, а обновления должны быть «вставлены».

Немедленный ответ - заменить операторы INSERT на * 1004.* операторы, которые могут быть возможны с использованием sed + awk, но не видя сценарии и форматы таблиц, которых мы не знаем.

Или другой подход будет к grep для значений ID в сценарии,и сгенерируйте для них блок DELETE s до INSERT s.

Опять же, без образца кода из вашего скрипта я не могу дать никакого кода о том, как вы это сделаете.

Несколько более сложный подход может быть следующим, предполагая, что ваша таблица называется the_app_table:

-- CREATE A table based on INSERT target

CREATE TABLE the_temp_table AS SELECT * FROM the_table WHERE 1 = 2;

Теперь соберите файл, чтобы изменить имя цели на временную таблицу:

sed 's/the_target_table/the_temp_table/' the_script.sql > the_new_script.sql

Запустите этот новый скрипт, который вставит данные во временную таблицу.

Запись одного оператора MERGE в UPSERT с the_temp_table до the_app_table.

...