Mia
Mia

Reputation: 25

Error while creating trigger using PL/SQL block

Question: fl_schedule(flno, departs, dtime, arrives, atime, price).

Create a trigger to allow insertion or updation only if Flight number CX­7520 is scheduled on Tuesday, Friday and Sunday.

CREATE OR REPLACE TRIGGER flightsch_day
BEFORE INSERT OR UPDATE ON fl_schedule
FOR EACH ROW
WHEN (NEW.flno LIKE 'CX7520')
DECLARE 
    day NUMBER;
BEGIN
    day:=EXTRACT(weekday FROM :NEW.departs);
    IF day NOT IN(0,2,5) THEN  
        RAISE_APPLICATION_ERROR(-20000,'Flight number CX­7520 can be scheduled only on Tuesday, Friday and Sunday.');
    END IF;
END;
/

ERRORS:

SQL> SHOW ERRORS;
Errors for TRIGGER FLIGHTSCH_DAY:

LINE/COL ERROR
-------- -----------------------------------------------------------------
4/10     PLS-00122: FROM as separator is allowed only with specific
         built-in functions

Upvotes: 1

Views: 144

Answers (1)

Barbaros Özhan
Barbaros Özhan

Reputation: 65105

In order to be able to use WHEN (NEW.flno = 'CX7520') after FOR EACH ROW, UPDATE OF flno is needed for individual column flno

CREATE OR REPLACE TRIGGER flightsch_day
BEFORE INSERT OR UPDATE OF flno ON fl_schedule
FOR EACH ROW
WHEN (NEW.flno = 'CX7520')
DECLARE 
BEGIN
 IF TO_CHAR(:NEW.departs,'Dy','NLS_DATE_LANGUAGE=English') NOT IN ('Tue','Fri','Sun') THEN  
     RAISE_APPLICATION_ERROR(-20000,'Flight number CX­7520 can be scheduled only on Tuesday, Friday and Sunday.');
 END IF;
END;
/

or without that WHEN.. clause, take :NEW.flno = 'CX7520' into IF Statement :

CREATE OR REPLACE TRIGGER flightsch_day
BEFORE INSERT OR UPDATE ON fl_schedule
FOR EACH ROW
DECLARE 
BEGIN
 IF NOT ( TO_CHAR(:NEW.departs,'Dy','NLS_DATE_LANGUAGE=English') IN ('Tue','Fri','Sun')
              AND :NEW.flno = 'CX7520' ) THEN  
    RAISE_APPLICATION_ERROR(-20000,'Flight number CX­7520 can be scheduled only on Tuesday, Friday and Sunday.');
 END IF;
END;
/
  • use day abbreviations containing NLS_DATE_LANGUAGE option. Otherwise you can meet the unexpected situations.
  • displayed error stems from use of weekday within EXTRACT() function where use of day, month, year allowed for a date type variable, also hour, minute, second ..etc. if it's a datetime type variable is allowed, but not weekday

Upvotes: 3

Related Questions