我是触发器的新手,现在这就是我的尝试。我有两个表 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
需要帮助!!在此先感谢!!
答案 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;
分享并享受。