Oracle PL / SQL触发器限制每个客户的订单

时间:2013-03-21 11:20:43

标签: oracle plsql triggers

正在努力创建一个小触发器。我想让这个触发器做的是确保一个客户当前只能在下订单表中有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命令未正确结束

非常感谢 理查德

1 个答案:

答案 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,这种方法可能不是一个好主意。


编辑突然意识到您的查询计算每个客户的订单数量是完全错误的。更新了我的答案。