У меня есть таблица инвентаризации с ожидаемыми и фактически полученными количествами. Допустим, inv.q_ex
и inv.q_rd
.
ВСТАВКА в таблицу имеет положительное значение в q_ex и ноль в q_rd, потому что он еще не прибыл. Я хотел бы запустить пакет, когда обнаружу, что значение q_rd изменяется с 0 на что-то другое, указывая, что оно получено и сохранено.
Создание триггера для обнаружения после обновления и проверки каждой строки легко, но Я не уверен, как обеспечить его запуск только один раз.
Скелет:
CREATE OR REPLACE TRIGGER example
AFTER UPDATE ON inv
FOR EACH ROW
BEGIN
IF :OLD.q_rd = 0 AND :NEW.q_rd > 0 THEN
pkg.proc();
END IF;
END;
/
Проблема, которую я вижу, заключается в том, что я хочу, чтобы она запускалась только один раз. Мне просто нужно определить, когда это должно быть выполнено. В идеале, в первом ряду, где выполняется мое условие, я должен был выйти из l oop (кажется, что тратить время на проверку, когда я уже знаю, что мне нужно выполнить) и вызвать мою процедуру.
Я не мог Не могу найти способ «выйти» для каждого и обработать его как обычное ПОСЛЕ ОБНОВЛЕНИЯ, поэтому я попытался использовать как ДО ОБНОВЛЕНИЯ, так и ПОСЛЕ ОБНОВЛЕНИЯ. Часть BEFORE будет проверять каждую строку и обновлять логическое значение. Часть AFTER будет ждать, пока это произойдет, и, если это так, вызовите процедуру.
CREATE OR REPLACE TRIGGER example
BEFORE UPDATE ON inv
FOR EACH ROW
DECLARE
shouldExecute BOOLEAN;
BEGIN
IF :OLD.q_rd = 0 AND :NEW.q_rd > 0 THEN
shouldExecute := TRUE;
END IF;
END;
AFTER UPDATE ON inv
BEGIN
IF shouldExecute THEN
pkg.proc();
END IF;
END;
/
Я подозреваю, что это не сработает в любом случае, потому что, согласно синтаксису, она повторно объявляет логическую переменную на каждом строка. Я подумал, что, возможно, я смогу сделать его «глобальным», но, как бы то ни было, оказалось, что я не могу добавить и ДО, и ПОСЛЕ к одному и тому же триггеру по какой-то причине (если я недостаточно исследовал), поэтому я разбил его на два триггера. , Проблема в том, что я не могу разделить это логическое значение между двумя триггерами. Могу ли я поделиться значением или я все об этом ошибаюсь?