#oracle #plsql #plsqldeveloper
#Oracle #plsql #plsqldeveloper
Вопрос:
Я пытаюсь заставить мой триггер срабатывать при изменении любого из перечисленных столбцов. Я хотел бы, чтобы определенные столбцы в таблице bb_prodchg_audit обновлялись при изменении любого из перечисленных столбцов в таблице bb_product. Мой код был скомпилирован до того, как я добавил имена столбцов во вставку в строки (хотя на самом деле это не вызывало срабатывания триггера при изменении любого из столбцов), но как только я добавил имена столбцов, я начал получать сообщение об ошибке «Ошибка (5,18): PLS-00201: идентификатор ‘PRODUCTNAME’ долженбыть объявленным», «Ошибка (9,18): PLS-00201: идентификатор ‘PRICE’ должен быть объявлен» и так далее.
Я новичок и не очень хорошо разбираюсь в PL / SQL, и мне трудно понять, как объявлять идентификаторы, или если это вообще правильный подход к ситуации.
CREATE OR REPLACE TRIGGER BB_PRODCHG_AUDIT
AFTER UPDATE OF productname, price, salestart, saleend, saleprice ON bb_product
FOR EACH ROW
BEGIN
IF (UPDATING(productname)) THEN
INSERT INTO bb_prodchg_audit (userid, chg_date, name_old, name_new)
VALUES (USER, SYSDATE, :OLD.productname, :NEW.productname);
END IF;
IF (UPDATING(price)) THEN
INSERT INTO bb_prodchg_audit (userid, chg_date, price_old, price_new)
VALUES(USER, SYSDATE, :OLD.price, :NEW.price);
END IF;
IF (UPDATING(salestart)) THEN
INSERT INTO bb_prodchg_audit (userid, chg_date, start_old, start_new)
VALUES(USER, SYSDATE, :OLD.salestart, :NEW.salestart);
END IF;
IF (UPDATING(saleend)) THEN
INSERT INTO bb_prodchg_audit (userid, chg_date, end_old, end_new)
VALUES(USER, SYSDATE, :OLD.saleend, :NEW.saleend);
END IF;
IF (UPDATING(saleprice)) THEN
INSERT INTO bb_prodchg_audit (userid, chg_date, sale_old, sale_new)
VALUES(USER, SYSDATE, :OLD.saleprice, :NEW.saleprice);
END IF;
END;
Редактировать для ясности: моя цель — добавлять значения userId, sysdate и old amp; new в таблицу bb_prodchg_audit с каждым изменением из таблицы bb_product.
Ответ №1:
В ваших UPDATING
предикатах имя столбца должно быть указано в виде строки. Поэтому используйте, например
IF UPDATING('SALEPRICE')...
вместо
IF UPDATING(SALEPRICE)...
Имейте в виду, что имена столбцов чувствительны к регистру и по умолчанию используются в Oracle в ВЕРХНЕМ РЕГИСТРЕ.
Желаю удачи.
Комментарии:
1. Исправлена одна проблема, но создана другая. Я настроил все IF (ОБНОВЛЕНИЕ) на «ВЕРХНИЙ» формат, и он перешел к «Ошибка (8,39): PL / SQL: ORA-00904: «ИДЕНТИФИКАТОР ПОЛЬЗОВАТЕЛЯ»: недопустимый идентификатор». Если я изменил все из них на «ВЕРХНИЙ» формат, это говорит мне, что мне не хватает ключевого слова SELECT во всех INSERT INTO.
2. Поцарапайте это, мне не хватало подчеркивания. Спасибо за вашу помощь!