PLSQL Вставьте и обновите другую таблицу с помощью триггера - PullRequest
0 голосов
/ 21 мая 2018

Я новичок в plsql;У меня есть 2 таблицы, таблица A и таблица B.

tableA - мой основной стол.После вставки или обновления таблицы А я хочу обновить ее связанной таблицей.

Например: таблица А имеет столбец с именем «GID_FROM_B», а таблица В имеет столбец с именем «GID».Я могу сопоставить значения этой таблицы с идентификатором и счетчиком.В соответствии с таблицей ниже я хочу добавить значения (2, 5, '') в таблицу A из моего интерфейса.И gid_from_b будет обновляться с помощью триггера.И я написал триггер ниже.

tableA:
id     |   counter  |   gid_from_b  |
1             3            xyz                            


tableB:
id     |   counter  |      gid      |
1             3            xyz                            
2             5            abc 

CREATE OR REPLACE TRIGGER gid_update
AFTER INSERT OR UPDATE ON DBO.TABLEA
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW

UPDATE TABLEA
   SET GID_FROM_B =  TABLEB.GID
   WHERE TABLEA.ID = TABLEB.ID AND TABLEA.COUNTER = TABLEB.COUNTER;
END;

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Вам не нужно запускать какой-либо оператор обновления, просто используйте выбор в: NEW.gid_from_b.Обратите внимание, что это должно быть BEFORE UPDATE TRIGGER, если вы хотите изменить значения столбцов :NEW.

Это предполагает, что ваш TableB имеет одну строку для каждой комбинации id и счетчика.Если нет, вам, возможно, придется получить MAX(gid) MIN(gid) или что-то еще, что вам подходит.

CREATE OR REPLACE TRIGGER gid_update
   BEFORE INSERT OR UPDATE ON TABLEA
FOR EACH ROW WHEN (NEW.gid_from_b IS NULL)
BEGIN
 SELECT gid INTO 
    :NEW.gid_from_b FROM tableB b 
  WHERE b.id =:NEW.id AND b.counter = :NEW.counter;
END;
/

dbfiddle

0 голосов
/ 21 мая 2018

Чтобы выполнить только INSERT операцию, нам нужно заменить AFTER INSERT OR UPDATE на BEFORE INSERT, где невозможно создать AFTER INSERT TRIGGER с :new префиксными столбцами.

Следующие костюмыхорошо для вашей цели:

CREATE OR REPLACE TRIGGER gid_update
BEFORE INSERT ON TableA
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN 
  for c in ( select b.gid from tableB b where b.id = :new.id and b.counter = :new.counter )
  loop
    :new.gid_from_b := c.gid; 
  end loop; 
END;
...