Oracle: использование подзапроса в триггере - PullRequest
4 голосов
/ 26 мая 2009

Как я могу обойти ограничение Oracle, запрещающее подзапросы в триггерах.

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

CREATE OR REPLACE TRIGGER trigger_w_subquery
AFTER UPDATE OR INSERT ON project_archiving
FOR EACH ROW WHEN (old.archiving_status <> new.archiving_status
  AND new.archiving_status = 1
  AND (SELECT offer FROM projects WHERE projnum = :new.projnum) IS NULL
)
BEGIN
  INSERT INTO offer_log (offer, status, date)
  VALUES (null, 9, sysdate);
END;

Ответы [ 3 ]

9 голосов
/ 26 мая 2009

Этот триггер сделает это:

CREATE OR REPLACE TRIGGER trigger_w_subquery
AFTER UPDATE OR INSERT ON project_archiving
FOR EACH ROW WHEN (old.archiving_status <> new.archiving_status
  AND new.archiving_status = 1
)
DECLARE
  l_offer projects.offer%TYPE;
BEGIN
  SELECT offer INTO l_offer 
  FROM projects 
  WHERE projnum = :new.projnum;

  IF l_offer IS NULL THEN
    INSERT INTO offer_log (offer, status, date)
    VALUES (null, 9, sysdate);
  END IF;
END;

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

5 голосов
/ 26 мая 2009

Я ожидаю, что вы хотите что-то вроде

CREATE OR REPLACE TRIGGER trigger_w_subquery
AFTER UPDATE OR INSERT ON project_archiving
FOR EACH ROW 
WHEN (old.archiving_status <> new.archiving_status
  AND new.archiving_status = 1)
DECLARE
  l_offer projects.offer%TYPE;
BEGIN
  SELECT offer 
    INTO l_offer
    FROM projects 
   WHERE projnum = :new.projnum;

  IF( l_offer IS NULL )
  THEN
    INSERT INTO offer_log (offer, status, date)
      VALUES (null, 9, sysdate);
  END IF;
END;
2 голосов
/ 26 мая 2009

Можете ли вы поставить условие в действие (между НАЧАЛОМ и КОНЕЦ) вместо того, чтобы «срабатывает»? Да, это означает, что тело триггера может сработать чаще - но если это поможет вам решить проблему ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...