SQL триггеры, вызывающие несколько таблиц

Я создаю триггер на уровне строк для Oracle с использованием инструментов SQL. Я приложу фотографию ERD, над которой я работаю. Я также включу свои инструкции, вставлю код, который я пробовал, и полученную ошибку.

Описание запроса: Создайте триггер уровня строки с именем "TRG_USED_COST" в таблице USED. Триггер должен выполняться ДО того, как в таблицу будет вставлена ​​новая строка. Команда вставки предоставит значение для "CHEM_NUM","JOB_NUM" и "USED_QTY", которые добавляются в таблицу. Используя CHEM_NUM, используемый во вставке, извлеките "CHEM_UNIT_COST" из таблицы CHEMICAL. Умножьте стоимость единицы химии на количество химикатов, используемых в этой строке, и включите это значение как "USED_CHARGE" для вставляемой строки.

Мой код:

CREATE OR REPLACE TRIGGER TRG_USED_COST
BEFORE INSERT OR UPDATE OF CHEM_NUM,JOB_NUM,USED_QTY ON USED
FOR EACH ROW
BEGIN
  UPDATE USED
  SET USED_CHARGE = CHEM_UNIT_COST * USED_QTY
  WHERE CHEM_NUM IS NOT NULL;
END;
/

После ввода кода я получаю сообщение об ошибке: PL/SQL: ORA-00904: "CHEM_UNIT_COST": неверный идентификатор

Я знаю, что получаю ошибку, потому что я не ссылался на таблицу CHEMICAL, в которой находится "CHEM_UNIT_COST"... но я не знаю, как ссылаться на нее.

1 ответ

У вас есть несколько вопросов здесь. Во-первых, вы не "обновляете" целевую таблицу в этом случае. Используйте атрибут:new на триггере. Затем выберите стоимость из другой таблицы.

CREATE OR REPLACE TRIGGER TRG_USED_COST
BEFORE INSERT OR UPDATE OF CHEM_NUM,JOB_NUM,USED_QTY ON USED
FOR EACH ROW
DECLARE
  v_cost CHEMICAL.CHEM_UNIT_COST%TYPE;
BEGIN
  SELECT CHEM_UNIT_COST
  INTO   v_cost
  FROM   CHEMICAL 
  WHERE  CHEM_NUM = :new.CHEM_NUM;

  :new.USED_CHARGE := v_cost * :new.USED_QTY;

END;
/
Другие вопросы по тегам