我有两张桌子:Ticket
和Cancel
(已取消门票)。
我创建了一个触发器,以便在将票证添加到Cancel
表时,它会在Ticket
表(Client_id
集NULL
)中空闲。
但必须有一个额外的选择:
如果故障单已添加到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;
答案 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