为什么这样的触发器不起作用?

时间:2014-03-18 19:02:24

标签: sql oracle11g

我有两张桌子:TicketCancel(已取消门票)。

我创建了一个触发器,以便在将票证添加到Cancel表时,它会在Ticket表(Client_idNULL)中空闲。

但必须有一个额外的选择:

如果故障单已添加到Cancel表,并且故障单是免费的(Client_id表中NULL已经Ticket),那么它不应该是#{1}}表。 t被添加到Cancel表或导致错误。

下面的触发器在添加到表Cancel时设置了免费票证(如果已购买),但即使票证是免费的,它仍然会向表Cancel添加票证。我想我应该添加一些约束或类似的东西。

CREATE OR REPLACE TRIGGER CANCEL_TICKET
      AFTER INSERT ON CANCEL
      FOR EACH ROW
      BEGIN
        UPDATE TICKET
          SET TICKET.CLIENT_ID = NULL
        WHERE TICKET.TICKET_ID = :NEW.TICKET_ID and TICKET.TICKET_ID IS NOT NULL;
      END;

1 个答案:

答案 0 :(得分:0)

您可以在插入之前使用上升错误:

CREATE OR REPLACE TRIGGER TRG_TUTOR_BLOCK
BEFORE INSERT OR UPDATE ON Cancel
FOR EACH ROW
DECLARE
    rowsCount INTEGER;
BEGIN
   <Add select statement to check if the ticket is free>
   IF rowsCount > 0
THEN
    RAISE_APPLICATION_ERROR(-20101, 'The ticket is free');
    ROLLBACK;
ELSE
     UPDATE TICKET
      SET TICKET.CLIENT_ID = NULL
    WHERE TICKET.TICKET_ID = :NEW.TICKET_ID and TICKET.TICKET_ID IS NOT NULL;
END IF;
END;

编辑: 要为rowsCount分配值,您可以使用select into子句: 像

这样的东西
select count(*) into rowsCount from my_table where...

在其他情况下,您可以使用列或其他exprssion以及变量类型替换count(*)。 http://docs.oracle.com/cd/B13789_01/appdev.101/b10807/13_elems045.htm