2014-03-18 35 views
0

我有兩個表格:TicketCancel(取消門票)。爲什麼這樣的觸發器不起作用?

我創建的觸發器,使得當車票被添加到Cancel表,它成爲在Ticket表(Client_idNULL)遊離。

但是,必須有一個附加選項:

如果票據被添加到Cancel表,門票是免費的(Client_id已經在TicketNULL),那麼它不應該被添加到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

從TRIGER的更新被解僱「之後INSERT ON取消」 –

回答

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... 

在其他情況下,您可以用列或其他表達式替換count(*)以及變量類型。 http://docs.oracle.com/cd/B13789_01/appdev.101/b10807/13_elems045.htm

+0

有用的建議,但有一些問題:我還沒有使用變量又是那麼我不知道是什麼值來初始化變量rowsCOUNT。而不是「<添加選擇語句來檢查票證是否免費>」我應該添加一些CHECK語句?但是CHECK不支持SELECT語句。我有這樣的選擇語句來檢查票是免費的:SELECT T.CLIENT_ID TICKET t WHERE t.TICKET_ID =:NEW.TICKET_ID和t.TICKET_ID不是NULL – Litwisha

+0

如何檢查票是免費的?我知道什麼選擇語句,但用什麼來檢查它? – Litwisha

+0

@ user3238724我更新了答案。 –

相關問題