2015-12-01 2 views
-1

Это мой SQL-триггер, и предполагается, что значение переупорядочения изменится на Y или N, если ON_HAND меньше или больше MINIMUM. Проблема в том, что он полностью игнорирует инструкцию set. Должен ли я организовывать это по-другому?Удивительно, почему мой оператор SQL игнорирует мой символ SET

CREATE OR REPLACE TRIGGER TRG_REORDER 
AFTER UPDATE OF ON_HAND, MINIMUM ON PART 

BEGIN 

IF ON_HAND <= MINIMUM THEN 
    SET REORDER = 'Y'; 
ELSE ON_HAND > MINIMUM 
    SET REORDER = 'N'; 

END IF; 
END; 
+4

Скомпилирует ли это? – sstan

+0

Этот код не компилируется. Он игнорирует инструкцию set. – Djb14

+0

Когда вы говорите *** игнорируете *** в своем вопросе, вы создаете впечатление, что триггер на самом деле выполняется правильно, но не выполняет определенную строку кода. В вашем случае 'SET' не является вашей единственной проблемой. Весь триггер не написан в правильном синтаксисе Oracle. – sstan

ответ

1

Я не знаю, триггеров Oracle, но я подозреваю, что вы хотите ДО триггера и задание, которое выглядит примерно так.

:new.REORDER := case when :new.ON_HAND <= :new.MINIMUM then 'Y' else 'N' end; 

Проверьте здесь, чтобы начать работу: http://www.techonthenet.com/oracle/triggers/before_update.php

+0

Это должно быть после. Когда MINIMUM или ON_HAND будет обновляться, ТОГДА изменится ЗАПИСЬ. Скажем, что МИНИМУМ равен 2, а ON_HAND - 5. Затем REORDER будет N, так как ON_HAND больше MINIMUM. – Djb14

+1

Да, триггер возникает, когда происходит обновление, но до фактического сохранения значений. Вот когда вы хотите, чтобы это произошло. – shawnt00

1

Trigger органы используют PL/SQL синтаксис, а не SQL. Поэтому для назначения вам нужно := не set.

В вашем коде есть и другие синтаксические ошибки.

  • Необходимо указать значения столбцов :new.
  • Вам не нужно условие в предложении ELSE.
  • Чтобы изменить значения столбцов в триггере, он должен быть триггером BEFORE и огнем для КАЖДОГО ROW.

Так что исправляя все это, теперь это должно работать для вас (оговорка: непроверенный код).

CREATE OR REPLACE TRIGGER TRG_REORDER 
before UPDATE OF ON_HAND, MINIMUM ON PART 
for each row 
BEGIN 

    IF :new.ON_HAND <= :new.MINIMUM THEN 
     :new.REORDER = 'Y'; 
    ELSE 
     :new.REORDER = 'N'; 
    END IF; 
END;