У меня есть таблица с идентификатором первичного ключа, именем, фамилией и уникальным идентификатором компании.
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?