Oracle Trigger при вставке, удалении или обновлении - PullRequest
1 голос
/ 02 марта 2011

Попытка создать триггер Oracle, который запускается после обновления таблицы любым способом. Я гуглил это все утро и придумал это:

CREATE OR REPLACE TRIGGER gb_qty_change
AFTER UPDATE OR INSERT OR DELETE ON F_ITEM_STORE
FOR EACH ROW
DECLARE
  v_qty V_AD_ON_HAND%rowtype;
  v_isbn TD_ITEM_DESCRIPTION.TD_IDENTIFIER%type;
BEGIN
    delete from gb_transaction where gb_tide = :new.ITST_ITEM_TIDE_CODE;
    select TD_IDENTIFIER INTO v_isbn from TD_ITEM_DESCRIPTION where TD_TIDE = :new.ITST_ITEM_TIDE_CODE;
    select * INTO v_qty from V_AD_ON_HAND where ITST_ITEM_TIDE_CODE = :new.ITST_ITEM_TIDE_CODE;
    insert into gb_transaction(gb_tide, gb_isbn, gb_used_on_hand, gb_new_on_hand)
      values(:new.ITST_ITEM_TIDE_CODE, v_isbn, v_qty.USED_ON_HAND, v_qty.NEW_ON_HAND);
END;
/

Я пытаюсь сохранить одну запись на TIDE_CODE в новой таблице.

V_AD_ON_HAND - это представление, которое извлекает счет инвентаря. gb_transaction - моя новая таблица, в которую я записываю эти события

Сравнивая его с кодом других людей, он выглядит так, как будто он должен работать, но я получаю "Предупреждение: триггер создан с ошибками компиляции."

1 Ответ

3 голосов
/ 02 марта 2011

Проблема, я полагаю, связана с: новыми обозначениями для триггера удаления.В конце концов, НЕТ значения, поскольку запись удалена.Вы можете получить доступ только к: OLD-значениям при удалении.

если вы разделите триггер по операции, вы можете сделать это.

CREATE OR REPLACE TRIGGER gb_qty_change 
AFTER UPDATE OR INSERT OR DELETE ON F_ITEM_STORE 
FOR EACH ROW 
DECLARE   
   v_qty V_AD_ON_HAND%rowtype;   
   v_isbn TD_ITEM_DESCRIPTION.TD_IDENTIFIER%type; 
BEGIN 
  IF INSERTING or UPDATING then
    ... insert your existing code
  ELSE
    ... do something similar with the :old values for the deleting case
  end if;
END;
/

Между прочим, как правило, полезно сообщить нам, ЧТОошибка не только в том, что она у вас была.При компиляции с помощью сценария SQL * Plus, после прямого слеша вызывается компиляция триггера после «end;»добавьте строку с текстом:

ПОКАЗАТЬ ОШИБКИ TRIGGER YOUR_TRIGGER_NAME;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...