Мне нужна помощь в исправлении ошибки таблицы мутантов - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть следующий триггер

create or replace trigger Overwrite 
before insert on Comments 
Compound trigger 
declare

begin for each row 
declare
num number; 
begin

select count('x') into num
from comments
where title = :new.title 
and director = :new.director
and club = :new.club
and nick = :new.nick;

if num != 0 then
    delete from Comments
    where title = :new.title 
    and director = :new.director
    and club = :new.club
    and nick = :new.nick;
end if;
end;

И когда я делаю массивную вставку, я получаю ошибку таблицы мутантов

insert into Membership(nick, club, mentor, type, req_date, inc_date, end_date, req_msg, acc_msg) values('davina', 'Fellowship of the Correct', 'adalbi', 'I', sysdate-2, sysdate, null, 'sdfghjhgfd', '23456543dcvbh'); 
insert into Proposals values ('O', 'Tim Blake Nelson', 'Fellowship of the Correct', 'davina', sysdate, 'asdkhaskd', 'lakshndlkjasdlkjasdfhasdjklhasdfjhkladfsjlhjklashjklds'); 
insert ALL 
    into comments (club, nick, msg_date, title, director, subject, message, valoration) values ('Fellowship of the Correct', 'ecp', sysdate-3, 'O', 'Tim Blake Nelson', 'asd', 'adsfasdfasdf', 10)
    into comments (club, nick, msg_date, title, director, subject, message, valoration) values ('Fellowship of the Correct', 'ecp', sysdate-2, 'O', 'Tim Blake Nelson', 'asd', 'adsfasdfdfghdfghasdf', 10)
    into comments (club, nick, msg_date, title, director, subject, message, valoration) values ('Fellowship of the Correct', 'ecp', sysdate-1, 'O', 'Tim Blake Nelson', 'asd', 'adsfasdfwertwerasdf', 10)
    into comments (club, nick, msg_date, title, director, subject, message, valoration) values ('Fellowship of the Correct', 'ecp', sysdate, 'O', 'Tim Blake Nelson', 'asd', 'adsfasdewrbtvwfasdf', 10)
select * from dual;

Проблема заключается в том, что при выполнении простой вставки I У меня нет проблемы с таблицей мутантов, но при массовых вставках возникает ошибка таблицы мутантов, которую я не очень хорошо понимаю, почему она возникает, и я не вижу, как ее исправить, если кто-то знает и может объяснить мне, как это исправить и почему это происходит, было бы хорошо.

Спасибо

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

Хотя я согласен с другим ответом, что это не лучший способ достичь этого, есть способ сделать это. Вы были на правильном пути с COMPOUND TRIGGER. Проверьте это:

CREATE OR REPLACE TRIGGER CMP_COMMENTS_DUP
FOR INSERT ON COMMENTS
COMPOUND TRIGGER
  TYPE lt_commentRows IS TABLE OF COMMENTS%ROWTYPE INDEX BY PLS_INTEGER;
  l_tComments lt_commentRows;
  l_nIndex INTEGER := 1;

  AFTER EACH ROW
  IS
  BEGIN
    l_tComments(l_nIndex).title:= :NEW.title;
    l_tComments(l_nIndex).director:= :NEW.director;
    l_tComments(l_nIndex).club:= :NEW.club;
    l_tComments(l_nIndex).nick:= :NEW.nick;
    l_nIndex := l_nIndex+1;
  END AFTER EACH ROW;

  AFTER STATEMENT IS
  BEGIN
    FORALL i IN INDICES OF l_tComments
      DELETE FROM comments c
      WHERE c.title= l_tComments(i).title
      AND c.director= l_tComments(i).director
      AND c.club= l_tComments(i).club
      AND c.nick= l_tComments(i).nick
      AND c.msg_date <> (SELECT MIN(c2.msg_date)
                         FROM comments c2
                         WHERE c2.title= l_tComments(i).title
                         AND c2.director= l_tComments(i).director
                         AND c2.club= l_tComments(i).club
                         AND c2.nick= l_tComments(i).nick);  
  END AFTER STATEMENT;
END;
/

Это заполнит ассоциативный массив для каждой строки после ее вставки. Затем во время части AFTER STATEMENT (когда манипулирование таблицами разрешено снова), он удалит дублирующиеся строки, сохраняя самое раннее сообщение по msg_date.

0 голосов
/ 09 апреля 2020

Почему вы используете триггер для того, что должно быть реализовано как ограничение unique?

alter table comments add constraint unq_comments_4
    unique (title, director, club, nick);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...