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;
/