спусковой крючок после вставки в оракула - PullRequest
0 голосов
/ 14 марта 2012

Я очень новый для триггера, теперь это то, что я пытался.У меня есть две таблицы INSERTED и ORDER_INFO , обе имеют одинаковое имя столбца ORDER_ID , ORDER_DATE .У меня есть сценарий, когда клиент будет размещать свой заказ, информация о заказе будет сохранена в таблице INSERTED , затем с помощью этого триггера она будет вставлена ​​в другую таблицу ORDER_INFO * 1012.* после выполнения условия, которое было записано.

    create trigger tri_check
AFTER INSERT ON inserted FOR EACH ROW
DECLARE
 v_date DATE;
BEGIN
    SELECT order_date INTO v_date FROM inserted;
if (v_date)< (sysdate + 2) then
 raiserror('You cannot take an order to be delivered less than 2 days from now',16, 1);
else
INSERT INTO orders_info
     ( order_id,order_date)
    VALUES
     (:new.order_id,v_date);
end if;
end;

Но, когда я выполняю вышеуказанный триггер, я получаю эту ошибку.

ERROR at line 8: PL/SQL: SQL Statement ignored
6.     SELECT order_date INTO v_date FROM inserted;
7. if (v_date)< (sysdate + 2) then
8.  raiserror('You cannot take an order to be delivered less than 2 days from now',16, 1);
9. else
10. INSERT INTO orders_info

EDIT

Теперь я создал ту же таблицу структуры для пользователя SYSTEM и получил ту же ошибку.Table or View does not exist

Нужна помощь !!Заранее спасибо !!

Ответы [ 2 ]

2 голосов
/ 14 марта 2012

Похоже, что сообщение указывает на проблему с процедурой 'raiserror'.Я не знаком с такой процедурой в стандартном PL / SQL - вы имели в виду RAISE_APPLICATION_ERROR?Однако, и, возможно, более важно, что при использовании триггера нет необходимости делать SELECT из таблицы.Все вставляемые данные доступны для триггера.Я предлагаю изменить свой триггер на что-то вроде следующего:

create trigger tri_check
  AFTER INSERT ON inserted
  REFERENCING NEW AS NEW
  FOR EACH ROW
BEGIN
  if :new.ORDER_DATE < sysdate + INTERVAL '2' DAY then
    RAISE_APPLICATION_ERROR(-20000, 'You cannot take an order to be delivered less than 2 days from now');
  else
    INSERT INTO orders_info
      (order_id, order_date)
    VALUES
      (:new.order_id, :new.ORDER_DATE);
  end if;
end TRI_CHECK; 

Поделитесь и наслаждайтесь.

2 голосов
/ 14 марта 2012

Вы можете просто использовать значения :NEW и :OLD вместо выбора:

CREATE TRIGGER tri_check
   AFTER INSERT
   ON inserted
   FOR EACH ROW
DECLARE
BEGIN
   IF :new.order_date < (SYSDATE + 2)
   THEN
      raiserror (
         'You cannot take an order to be delivered less than 2 days from now',
         16,
         1);
   ELSE
      INSERT INTO orders_info (order_id, order_date)
      VALUES (:new.order_id, :new.order_date);
   END IF;
END;

Какова ваша raiserror процедура? У вас есть права доступа?

Надеюсь, это поможет ...

EDIT:

ОК, из-за вашей ошибки и ошибки, которую вы опубликовали в ответе @Bob Jarvis, у вас может не быть привилегии INSERT для таблицы ORDERS_INFO. Вы также должны проверить свои разрешения в таблице INSERTED.

Проверьте ваши разрешения с вашим администратором базы данных.

Если raiserror не определенная процедура или у вас нет доступа к ней, используйте метод RAISE_APPLICATION_ERROR для выдачи ошибки, как предлагает Боб.

...