【问题标题】:fire trigger after insert in oracle插入oracle后触发触发
【发布时间】:2012-03-30 20:15:29
【问题描述】:

我对触发器很陌生,现在这就是我正在尝试的。我有两个表 INSERTEDORDER_INFO,它们都有相同的列名 ORDER_IDORDER_DATE。我有一个场景,客户将下订单,然后订单信息将存储到 INSERTED 表中,然后通过使用此触发器,它将插入到另一个表中 ORDER_INFO满足条件后,已经写好了。

    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

需要帮助!!提前致谢!!

【问题讨论】:

    标签: oracle triggers oracle-xe


    【解决方案1】:

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

    分享和享受。

    【讨论】:

    • ERROR at line 5: PL/SQL: ORA-00942: table or view does not exist 3. REFERENCING NEW AS NEW 4. FOR EACH ROW 5. BEGIN 6. if :new.ORDER_DATE &lt; (sysdate + 2) then 7. RAISE_APPLICATION_ERROR(-20000, 'You cannot take an order to be delivered less than 2 days from now');
    • @sql_query - INSERTED 表是否存在于您当前的模式中?表名是大写还是小写?如果是小写,则需要用双引号将表名括起来(即在“插入”后插入)。 IMO 小写或 CamelCase 表名比它们的价值更麻烦。 YMMV。
    • 是的,当然,如果你想要截图,我可以给你看。
    • ERROR at line 7: PL/SQL: ORA-00942: table or view does not exist 5. IF :new.order_date &lt; (SYSDATE + 2) 6. THEN 7. RAISE_APPLICATION_ERROR(-20000, 'You cannot take an order to be delivered less than 2 days from now'); 8. ELSE 9. INSERT INTO orders_info (order_id, order_date)
    • 我发现了问题,只是因为提到了错误的表名order_info。谢谢!!
    【解决方案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 的回答中发布的错误,您可能没有INSERTORDERS_INFO 表的权限。您还应该检查您对INSERTED 表的权限。

    与您的 DBA 检查您的权限。

    如果raiserror 不是已定义的过程,或者您无权访问它,则按照 Bob 的建议使用 RAISE_APPLICATION_ERROR 方法引发错误。

    【讨论】:

    • ERROR at line 7: PL/SQL: SQL Statement ignored 5. DECLARE 6. BEGIN 7. IF :new.order_date &lt; (SYSDATE + 2) 8. THEN 9. raiserror ('You cannot take an order to be delivered less than 2 days from now',16,1);
    • 好的,你能回答我关于你的raiserror程序的问题吗?
    • 我不知道,我只是从我的朋友那里得到了部分代码并在我自己的场景中使用它。如果你知道除此之外,那么你可以告诉
    • 我怎么知道你的朋友有什么程序和权限,或者你的场景有什么,因为你除了触发器之外没有描述任何东西?你创建数据库了吗?您是否创建了表 INSERTEDORDERS_INFO?如果是这样,您对它们有权限,如果没有,请与创建它们的人交谈以授予您相关权限。
    • 现在,授予了我的数据库的所有权限,但仍然显示错误table or view does not exist
    猜你喜欢
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多