1

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

非常感谢理查德

4

1 回答 1

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


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

于 2013-03-21T11:52:09.433 回答