Ошибка уникального ограничения и при выполнении триггера oracle - PullRequest
0 голосов
/ 29 сентября 2019

У меня есть форма, в которой пользователь может добавить информацию о новорожденном с указанием его фамилии.При добавлении информации в таблицу появляются следующие ошибки

ORA-00001: unique constraint (PK) violated
ORA-06512: at trigger_name, line 21
ORA-04088: error during execution of trigger

Триггер:

CREATE OR REPLACE TRIGGER "DB_NAME"."TRG_NBB" 
AFTER INSERT ON baby
FOR EACH ROW
 WHEN (new.status = 'A') DECLARE
 v_1 tab_1.col_1%type;
 v_2 tab_2.col_2%type;
 v_3 tab_2.col_3%type;
 v_4 tab_2.col_4%type;
 v_5 tab_2.col_5%type;
 v_6 date;
 newmofid number;

BEGIN
 select max(nvl(col_2,0))+1 into newmofid from tab_2;
 SELECT distinct col_1,col_2,to_char(col,'DD-MM-YYYY') INTO v_1,v_2,v_6
 from table
 where tcid = :new.tcid;

 SELECT col_4,col_5,col_3 into v_4,v_5,v_3
 from tab_2
 where col_1 = v_1
 and col_2 = v_2; 

 INSERT INTO tab_2 (all_columns)
 VALUES(variable_names);

 DBMS_OUTPUT.PUT_LINE('New Born Baby successfully added to member table');
END trg_nbb;
/
ALTER TRIGGER "DB_NAME"."TRG_NBB" ENABLE;

Когда я выполняю этот SQL-запрос, это занимает от 4 до 5 секунд и увеличиваетсязначения очень быстро

select max(nvl(col_2,0))+1 into newmofid from tab_2;

Результат:

6030819791

Повторное выполнение занимает от 3 до 4 секунд

Результат:

6030819798

Как решитьэта проблема?

спасибо

1 Ответ

0 голосов
/ 29 сентября 2019

Я подозреваю, что MAX + 1 вызывает проблемы:

select max(nvl(col_2,0))+1 into newmofid from tab_2;

Такой принцип в большинстве случаев неверен и не работает, особенно в многопользовательской среде, где два (или более) пользователя вв то же время получить то же самое значение MAX + 1, выполнить некоторую обработку и - во время вставки - одно из них выполнится успешно (поскольку оно является первым), но остальные не выполнятся, поскольку такое значение уже существует в таблице.

Я предлагаю вам перейти на последовательность , например,

create sequence seq_baby;

, а затем, в вашей форме, сделать

select seq_baby.nextval into newmofid from dual;
...