2017-01-29 4 views
1

Почему этот код не работает в ORACLE?ORACLE - CHECK DATE TRIGGER

CREATE TRIGGER chk_dates 
BEFORE INSERT ON `job_history` 
FOR EACH ROW 
BEGIN 
    IF (NEW.end_date < NEW.start_date) THEN 
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'end_date cannot be earlier than start_date'; 
    END IF; 
END; 

У меня есть журнал: ORA-00911: "недопустимый символ"

+0

Где в [руководстве Oracle] (HTTP: // docs.oracle.com/cd/E11882_01/appdev.112/e25519/toc.htm) вы нашли 'signal sqlstate'? И почему вы используете для этого триггер? Будет выполнено простое проверочное ограничение. Кроме того: '' 'job_history \' 'является недопустимым идентификатором в SQL (и Oracle) –

ответ

2

Вы смешиваете синтаксис MySQL с Oracle. В Oracle нет SIGNAL SQLSTATE.

В Oracle используйте raise_application_error, чтобы поднять ошибку.

BEGIN 
    IF (:NEW.end_date < :NEW.start_date) THEN 
    raise_application_error(-20001, 'end_date cannot be earlier than start_date'); 
    END IF; 
END; 

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

alter table your_table 
add constraint contraint_name check (end_date >= start_date);