首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果(:old.actDepartDateTime为NULL),则

如果(:old.actDepartDateTime为NULL),则
EN

Stack Overflow用户
提问于 2019-05-25 17:08:01
回答 2查看 682关注 0票数 1

如果任何已删除的机票对应于尚未起飞的航班,则备份该机票的航班ID、机票编号和座位号。

创建序列generateKey,从100开始递增1;

代码语言:javascript
复制
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为NULL)作为错误的绑定运算符出现错误

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-26 02:27:58

首先,您的触发器应该在售票表上,而不是在航班表上。其次,如果航班已经起飞,您不应该创建机票的备份。您的代码总是创建备份。我建议使用以下方法可能会更好:

代码语言:javascript
复制
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;

此外,备份表的名称应该是BACKUP_TICKET而不是backUpTicket,因此您可能会因此而被标记下来。

此外,虽然我意识到这是一个家庭作业,但这是一个非常糟糕的设计选择。您应该创建一个执行删除票据所需的所有操作的过程,而不是将“魔法代码”埋藏在执行此类业务决策的触发器中。

祝你好运。

票数 3
EN

Stack Overflow用户

发布于 2019-05-25 17:42:38

根据您的注释,您的触发器在表TICKET上,但是列actDepartDateTime在表FLIGHT中。您只能使用:OLD:NEW访问触发器表中的列。要获得actDepartDateTime,您需要使用:OLD.flightID值从FLIGHT表中进行选择。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56303373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档