2015-10-24 6 views
1

Я пытаюсь проверить мой триггер, если вставленная запись находится в таблице TUTPRAC содержит и CLASSTIME < '9AM' OR > '6PM'. Если это так, то эта запись обновляется с изменением определенных полей на NULL.Как проверить, больше или меньше времени в PLSQL,

CREATE TRIGGER CheckBeforeAfterHours 
BEFORE INSERT OR UPDATE OF CLASS_TIME ON TUTPRAC 
FOR EACH ROW 
BEGIN 
    IF (:NEW.CLASS_TIME < '09:00' OR > '18:00') THEN 
    :NEW.STAFFNO := NULL; 
    :NEW.CLASS_DAY := NULL; 
    :NEW.CLASS_TYPE := NULL; 
    :NEW.ROOMNUM := NULL; 
    END IF; 
END CheckBeforeAfterHours; 

Колонна TUTPRAC таблицы:

CLASSID (PK), UNITCODE, STAFFNO, CLASSDAY, CLASSTIME, CLASSTYPE, ROOMNUM 

В поле CLASSTIME установлена ​​в varchar(5).

Я использую Oracle SQLDeveloper.

ПРОБЛЕМА

мой вопрос заключается в том, что я постоянно получаю эту ошибку, когда я пытаюсь запустить триггер:

Error(2,36): 
PLS-00103: Encountered the symbol ">" when expecting one of the following: 
    (- + case mod new not null <an identifier> <a double-quoted delimited-identifier> 
    <a bind variable> continue avg count current exists max min prior sql stddev 
    sum variance execute forall merge time timestamp interval 
    date <a string literal with character set specification> 
    <a number> <a single-quoted SQL string> pipe 
    <an alternatively-quoted string literal with character set specification> 
    <an alternatively 

ответ

2

Правильный синтаксис:

IF (:NEW.CLASS_TIME < '09:00' OR :NEW.CLASS_TIME > '18:00') THEN 
+0

Это зависит от фиксированного формата, чтобы убедиться, что преобразование ascii дает правильный результат. –

2

Есть два вопросы здесь:

IF (: NEW.CLASS_TIME < '09: 00' OR> '18: 00')

Синтаксис неверен. Вы должны указать :NEW.CLASS_TIME в ИЛИ условие тоже.

Поле "CLASSTIME" установлен в VARCHAR (5)

Тогда вы должны пойти для количественного сравнения, а не сравнения строк. Сравнение строк основано на фиксированном формате , который производит сравнение, основанное на значениях ASCII, а не на чистом номере.

Скажем, если вы передаете 5:00 вместо 05:00, то есть, если формат не является фиксированной, то сравнение будет давать разные выходы потому что ASCII значения будут отличаться.

SQL> SELECT ascii('05:00'), ascii('5:00') FROM dual; 

ASCII('05:00') ASCII('5:00') 
-------------- ------------- 
      48   53 

Настройка

SQL> CREATE TABLE t(A VARCHAR2(5)); 

Table created. 

SQL> INSERT INTO t VALUES('04:00'); 

1 row created. 

SQL> INSERT INTO t VALUES('05:00'); 

1 row created. 

SQL> COMMIT; 

Commit complete. 

SQL> SELECT * FROM t; 

A 
----- 
04:00 
05:00 

Сравнение строк

SQL> SELECT * FROM t WHERE a < '5:00'; 

A 
----- 
04:00 
05:00 

SQL> SELECT * FROM t WHERE a < '05:00'; 

A 
----- 
04:00 

Так что случилось выше? '05:00' и '5:00' не то же самое. Чтобы избежать этой путаницы, лучше пойти на числовое сравнение.

SQL> SELECT * FROM t WHERE TO_NUMBER(SUBSTR(a, 2, 1)) < 5; 

A 
----- 
04:00 

SUBSTR извлечет цифровую часть и to_number явным образом преобразовать его в число.