【问题标题】:IF(:old.actDepartDateTime IS NULL) THENIF(:old.actDepartDateTime 为空) 那么
【发布时间】:2019-05-25 09:08:01
【问题描述】:

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

创建序列 generateKey 从 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) 作为错误绑定运算符出现的错误

【问题讨论】:

  • 表backUpTicketCancelled中有哪些列?
  • 这只是问题和答案,触发器被命名为backupTicketCancelled
  • 抱歉,我的意思是 TICKET 表中的列是什么 - 即触发器所在的列?
  • @TonyAndrews 你能帮帮我吗? FLIGHT(flightID,estDepartureDateTime,actDepartDateTime,actArriveDateTime,avgSpeed,avgHeight,estDuration,estFuel,haulType,captainStaffID,firstOfficerStaffID,routeID,aircraftID)TICKET(ticketNum,baggageLimit,seatNum,classCode,medicalCondition,mealChoice,customerID,flightID)
  • 希望以上帮助...@TonyAndrews

标签: oracle plsql database-trigger


【解决方案1】:

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

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,因此您可能会因此而被标记。

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

祝你好运。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 在飞行中删除每一行之前创建或替换触发器 backUpTicketCancelled 现在可以使用吗?
    • 那位可以,但是您将无法备份票证?
    • IF(比较航班和机票的航班ID) AND (:old.actDepartDateTime IS NULL) THEN DBMS_OUTPUT.PUT_LINE('航班还没有起飞');如果结束;
    • 我没明白
    猜你喜欢
    • 2012-02-16
    • 2015-06-13
    • 2021-10-30
    • 1970-01-01
    • 2019-12-24
    • 2023-01-14
    • 1970-01-01
    • 2016-01-20
    • 2014-01-31
    相关资源
    最近更新 更多