正在努力创建一个小触发器。我想让这个触发器做的是确保一个客户当前只能在下订单表中有10个订单。不要问为什么我的客户想要这对我来说似乎很傻。
但基本上触发器位于已下订单表上,我当前正在customer_ID上选择DISTINCT COUNT并将其放入v_count VARIABLE。
IF v_count < 10 INSERT INTO placed_order
ELSE
DBMS_OUTPUT.PUT_LINE ('you have 10 or more orders processing please wait')
END if
END
这是代码的基本要点,但它不会运行我可以显示完整的代码,如果有人想要的话吗?
这是代码 - 对不起,我现在不知道如何使用SQLFiddle。
CREATE OR REPLACE TRIGGER trg_order_limit
BEFORE INSERT
ON placed_order
FOR EACH ROW
DECLARE
v_count number;
BEGIN
SELECT COUNT(DISTINCT FK1_customer_id) FROM placed_order into v_count;
if v_count < 10 then
INSERT INTO placed_order
(order_id, order_date, delivery_date, FK1_customer_id, FK2_employee_id, FK3_Order_type_id)
VALUES
(:NEW.order_id, :NEW.order_date, :NEW.delivery_date, :NEW.FK1_customer_id, :NEW.FK2employee_id, :NEW.FK3_order_type_id);
ELSE
v_count > 10 then
DBMS_OUTPUT.PUT_LINE('You currently have 10 or more orders processing.');
end if;
end;
当我在oracle中运行脚本时,我得到了 第4行出错:PL / SQL:ORA-00933:SQL命令未正确结束
非常感谢 理查德
答案 0 :(得分:3)
即使你的触发器没有语法错误,它也行不通:它只输出“不能超过10个订单”的消息,插入仍然会继续;而且,如果它通过了测试,你将被置于一个插入循环中。如果记录太多,你需要让它抛出一个异常,你的应用程序需要抓住它,如果它通过了测试就什么都不做。
至于错误,我认为问题在于这一行:
SELECT COUNT(DISTINCT FK1_customer_id) FROM placed_order into v_count;
应该是:
SELECT COUNT(DISTINCT FK1_customer_id) into v_count FROM placed_order;
但是,此查询无论如何都是错误的:它将返回已下订单的唯一客户的数量。你在寻找的是:
select count(order_id) into v_count from placed_order where fk1_customer_id = :new.fk1_customer_id
假设order_id
具有唯一性约束;这看起来很可能!无论如何,你的触发器代码应该是这样的:
create or replace trigger trg_order_limit
before insert on placed_order for each row
declare
v_count number;
begin
-- Get current order count
select count(order_id)
into v_count
from placed_order
where fk1_customer_id = :new.fk1_customer_id;
-- Raise exception if there are too many
if v_count >= 10 then
raise_application_error(-20000, 'You currently have 10 or more orders processing.');
end if;
end;
然而,根据@DazzaL's comment,这种方法可能不是一个好主意。
编辑突然意识到您的查询计算每个客户的订单数量是完全错误的。更新了我的答案。