PL SQL Oracle10 Dialect mimi c Функциональность UPSERT с использованием триггера - PullRequest
0 голосов
/ 27 мая 2020

У меня есть таблица с идентификатором первичного ключа, именем, фамилией и уникальным идентификатором компании.

CREATE TABLE "EMPLOYEE"(
  "ID" NUMBER(*,0) NOT NULL ENABLE, 
  "FIRST_NAME" VARCHAR2(255 BYTE), 
  "LASNT_NAME" VARCHAR2(255 BYTE), 
  "COMPANY_ID" VARCHAR2(255 BYTE))
CONSTRAINT "EMPLOYEE_PK" PRIMARY KEY ("ID")
CONSTRAINT "UNIQUE_COMPANY_ID" UNIQUE ("COMPANY_ID")

У меня есть пакетное задание, которое проверяет наличие новых сотрудников и изменения имени и запускает инструкция вставки

INSERT INTO EMPLOYEE(FIRST_NAME,LAST_NAME,COMPANY_ID)
VALUES("NEW EMPLOYEE FIRST NAME","NEW EMPLOYEE LAST NAME", "NEW EMPLOYEE 123")

Если был сотрудник, который изменил свое имя, будет выбрано исключение oracle.

ORA-00001: unique constraint (UNIQUE_COMPANY_ID) violated

Я хочу обновить, когда вместо этого будет выбрано это исключение попытки вставить значение. Стоит ли использовать для этого триггер? Будет ли это выглядеть так:

CREATE OR REPLACE TRIGGER INSERT_TO_UPDATE
BEFORE INSERT ON EMPLOYEE FOR EACH ROW
BEGIN
   NULL;
EXCEPTION
   UPDATE EMPLOYEE SET
       FIRST_NAME = :NEW.FIRST_NAME,
       LAST_NAME = :NEW.LAST_NAME
END;

Где я ничего не делаю в блоке начала и перехватываю исключение. Я предполагаю, что, поскольку в начальном блоке нечего запускать, он запустит вставку, а затем, если есть сотрудник с тем же EMPLOYEE_ID, он перехватит исключение, созданное ранее. Следует ли мне проверять, есть ли в начальном блоке строка вроде этой:

CREATE OR REPLACE TRIGGER INSERT_TO_UPDATE
BEFORE INSERT ON EMPLOYEE FOR EACH ROW
DECLARE
    results_found NUMBER(1,0)
BEGIN
   SELECT COUNT(*)
   INTO results_found
   FROM EMPLOYEE
   AND COMPANY_ID = :NEW.COMPANY_ID;
   IF results_found = 0 THEN
       INSERT INTO EMPLOYEE(FIRST_NAME,LAST_NAME,COMPANY_ID)
       VALUES(:NEW.FIRST_NAME,:NEW.LAST_NAME)
   END IF;
   END;

EXCEPTION
   UPDATE EMPLOYEE SET
       FIRST_NAME = :NEW.FIRST_NAME,
       LAST_NAME = :NEW.LAST_NAME
   WHERE EMPLOYEE_ID = :NEW_EMPLOYEE_ID
END;

Есть ли другой способ mimi c UPSERT в Oracle10?

...