IF(:old.actDepartDateTime 为 NULL) 那么
IF(:old.actDepartDateTime IS NULL) THEN
如果机票对应的是尚未起飞的航班,则备份任何已删除机票的航班号、机票号和座位号。
创建序列生成密钥
从 100 开始
增加 1;
CREATE TABLE backUpTicket
(
cancelledKey NUMBER NOT NULL,
flightID char(9) NOT NULL,
ticketNum varchar2(5) NOT NULL,
seatNum NUMBER(3) NOT NULL,
PRIMARY KEY(cancelledKey)
);
CREATE OR REPLACE TRIGGER backUpTicketCancelled
BEFORE DELETE ON FLIGHT
FOR EACH ROW
BEGIN
INSERT INTO backUpTicket
VALUES
(generateKey.nextVal, :old.flightID, :old.TicketNum, :old.seatNum);
IF(:old.actDepartDateTime IS NULL) THEN
DBMS_OUTPUT.PUT_LINE('The Flight has not departed yet');
END IF;
END backUpTicket;
/
IF(:old.actDepartDateTime IS NULL) 中的错误是错误的绑定运算符
根据您的评论,您的触发器位于 table TICKET
,但 actDepartDateTime
列位于 table FLIGHT
。您只能使用 :OLD
和 :NEW
从触发器的 table 访问列。要获得 actDepartDateTime
,您需要使用 :OLD.flightID
值从 FLIGHT
table select。
首先,您的触发器应该在 TICKET table,而不是 FLIGHT table。其次,如果航班已经起飞,您不应该创建机票的备份。您的代码始终会创建备份。我建议以下方法可能效果更好:
CREATE OR REPLACE TRIGGER backUpTicketCancelled
BEFORE DELETE ON TICKET
FOR EACH ROW
DECLARE
rowFlight FLIGHT%ROWTYPE;
BEGIN
SELECT *
INTO rowFlight
FROM FLIGHT f
WHERE f.FLIGHTID = :OLD.FLIGHTID;
IF rowFlight.actDepartDateTime IS NULL THEN
INSERT INTO backUpTicket
(CANCELLEDKEY, FLIGHTID, TICKETNUM, SEATNUM)
VALUES
(generateKey.nextVal, :old.flightID, :old.TicketNum, :old.seatNum);
ELSE
DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE', 'DD-MON-YYYY HH24:MI:SS') || ': ' ||
'Flight ' || :OLD.FLIGHTID || ' departed at ' ||
TO_CHAR(rowFlight.actDepartDateTime, 'DD-MON-YYYY HH24:MI:SS' ||
' so ticket #' || :OLD.TICKETNUM || ' for seat #' || :OLD.SEATNUM ||
' is not eligible for backup');
END IF;
END backUpTicket;
此外,备份的名称 table 应该是 BACKUP_TICKET
而不是 backUpTicket
,因此您可能会因此而被标记。
此外,虽然我意识到这是一项家庭作业,但这是一个非常糟糕的设计选择。您应该创建一个过程来执行删除票证所需的所有操作,而不是将 "magic code" 埋在执行此类业务决策的触发器中。
祝你好运。
如果机票对应的是尚未起飞的航班,则备份任何已删除机票的航班号、机票号和座位号。
创建序列生成密钥 从 100 开始 增加 1;
CREATE TABLE backUpTicket
(
cancelledKey NUMBER NOT NULL,
flightID char(9) NOT NULL,
ticketNum varchar2(5) NOT NULL,
seatNum NUMBER(3) NOT NULL,
PRIMARY KEY(cancelledKey)
);
CREATE OR REPLACE TRIGGER backUpTicketCancelled
BEFORE DELETE ON FLIGHT
FOR EACH ROW
BEGIN
INSERT INTO backUpTicket
VALUES
(generateKey.nextVal, :old.flightID, :old.TicketNum, :old.seatNum);
IF(:old.actDepartDateTime IS NULL) THEN
DBMS_OUTPUT.PUT_LINE('The Flight has not departed yet');
END IF;
END backUpTicket;
/
IF(:old.actDepartDateTime IS NULL) 中的错误是错误的绑定运算符
根据您的评论,您的触发器位于 table TICKET
,但 actDepartDateTime
列位于 table FLIGHT
。您只能使用 :OLD
和 :NEW
从触发器的 table 访问列。要获得 actDepartDateTime
,您需要使用 :OLD.flightID
值从 FLIGHT
table select。
首先,您的触发器应该在 TICKET table,而不是 FLIGHT table。其次,如果航班已经起飞,您不应该创建机票的备份。您的代码始终会创建备份。我建议以下方法可能效果更好:
CREATE OR REPLACE TRIGGER backUpTicketCancelled
BEFORE DELETE ON TICKET
FOR EACH ROW
DECLARE
rowFlight FLIGHT%ROWTYPE;
BEGIN
SELECT *
INTO rowFlight
FROM FLIGHT f
WHERE f.FLIGHTID = :OLD.FLIGHTID;
IF rowFlight.actDepartDateTime IS NULL THEN
INSERT INTO backUpTicket
(CANCELLEDKEY, FLIGHTID, TICKETNUM, SEATNUM)
VALUES
(generateKey.nextVal, :old.flightID, :old.TicketNum, :old.seatNum);
ELSE
DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE', 'DD-MON-YYYY HH24:MI:SS') || ': ' ||
'Flight ' || :OLD.FLIGHTID || ' departed at ' ||
TO_CHAR(rowFlight.actDepartDateTime, 'DD-MON-YYYY HH24:MI:SS' ||
' so ticket #' || :OLD.TICKETNUM || ' for seat #' || :OLD.SEATNUM ||
' is not eligible for backup');
END IF;
END backUpTicket;
此外,备份的名称 table 应该是 BACKUP_TICKET
而不是 backUpTicket
,因此您可能会因此而被标记。
此外,虽然我意识到这是一项家庭作业,但这是一个非常糟糕的设计选择。您应该创建一个过程来执行删除票证所需的所有操作,而不是将 "magic code" 埋在执行此类业务决策的触发器中。
祝你好运。