在oracle中插入后触发触发器

时间:2012-03-14 11:12:46

标签: oracle triggers oracle-xe

我是触发器的新手,现在这就是我的尝试。我有两个表 INSERTED ORDER_INFO ,两个都有相同的列名 ORDER_ID ORDER_DATE 。我的情况是,客户将放置他/她的订单,订单信息将存储到 INSERTED 表中,然后通过使用此触发器,它将插入另一个表 ORDER_INFO < / strong>满足已写入的条件后。

    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

修改

现在,我在 SYSTEM 用户中创建了相同的结构表,并得到了相同的错误。 Table or View does not exist

需要帮助!!在此先感谢!!

2 个答案:

答案 0 :(得分:2)

您可以使用: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程序是什么?您是否拥有授予的访问权限?

希望它有所帮助...

修改

好的,从您的错误,以及您在@Bob Jarvis&#39;上发布的错误回答,您可能没有INSERT表的ORDERS_INFO权限。您还应该检查INSERTED表上的权限。

使用您的DBA检查您的权限。

如果raiserror不是定义的程序,或者您无法访问它,请使用RAISE_APPLICATION_ERROR方法引发错误,如Bob建议的那样。

答案 1 :(得分:2)

该消息似乎表明“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; 

分享并享受。