ошибка при попытке сделать триггер в оракуле - PullRequest
1 голос
/ 27 января 2010

Я пытаюсь создать TRIGGER в ORACLE, используя ORACLE SQL DEVELOPER. Я бы хотел убедиться, что даты, введенные в качестве даты начала резервирования для даты бронирования или даты сбора за обслуживание, будут равны или превышают текущую дату в записи.

это поля в моей таблице

Service (date_service, cost_variation, number_room, id_service);

это мой код:

CREATE OR REPLACE TRIGGER VERIFY_DATE
BEFORE INSERT OR UPDATE OF FECHA_PLAN ON SERVICE
FOR EACH ROW
DECLARE
  fecha_ac DATE;
BEGIN
  SELECT SYSDATE INTO fecha_ac FROM DUAL;
  IF(:NEW.FECHA_PLAN > fecha_ac)THEN
    dbms_output.put_line('The date of the plan should be more than the current date ');
    raise_application_error(-20601, 'Dato invalido');
  END IF;
END;

и это ошибка, которую я получаю при попытке запустить TRIGGER

INSERT INTO "MIGRARBD"."SERVICE" 
    (date_service, cost_variation, number_room, id_service) 
VALUES 
    (TO_DATE('20/01/10', 'DD/MM/RR'), '2', '1', '1')

Произошла ошибка при сохранении изменений в таблице "MIGRARBD". "SERVICE":

Fila 1: ORA-20601: Dato invalido
ORA-06512: en "MIGRARBD.VERIFICAR_FECHA", línea 7
ORA-04088: error during execution of trigger 'MIGRARBD.VERIFICAR_FECHA'
ORA-06512: on line 1

Я надеюсь, что вы можете помочь ... и извините за мой английский

Ответы [ 3 ]

4 голосов
/ 27 января 2010

Ваш триггер ссылается на FECHA_PLAN, что не соответствует тому, как вы определили таблицу. Предположительно это то же самое, что и DATE_SERVICE.

Как вы его кодировали, триггер не работает, если введенная дата больше текущей даты. Но когда вы говорите ...

Я бы проверил, что введенные даты ... будет равно или больше чем текущая дата вставляется в запись.

... возможно, вы хотите применить правило о том, что дата должна быть больше или равна текущей дате. Если это так, ваш триггер должен завершиться ошибкой, если введенная дата меньше текущей даты. Вот так ...

ЕСЛИ (: NEW.FECHA_PLAN

Обратите внимание, что мы можем использовать sysdate напрямую, поэтому select ... from dual не требуется (если только Рене не укажет в комментариях, вы хотите использовать одно и то же значение несколько раз).

Если это не решит вашу проблему, вам нужно объяснить немного больше.

2 голосов
/ 27 января 2010

Разве вы не сравниваете дату с тем, что вы заявили, что хотели? Вы получаете сообщение об ошибке, если введенная дата больше, чем SYSDATE. Разве вы не должны проверять SYSDATE больше, чем дата, вставленная в новую запись? Попробуйте это:

  IF(fecha_ac >= :NEW.FECHA_PLAN)THEN
    dbms_output.put_line('The date of the plan should be more than the current date ');
    raise_application_error(-20601, 'Dato invalido');
  END IF;
0 голосов
/ 28 января 2010

Если триггер вызывает вашу пользовательскую ошибку 20601, это означает, что триггер скомпилирован успешно и работает, и проблема заключается в вашей логике. В вашем вопросе недостаточно ясно, хотите ли вы запретить прошлые или будущие даты. Другими словами: если план fecha должен быть будущим, оператор ошибается. Если это должно быть прошлое свидание, тогда все в порядке.

С учетом всего вышесказанного не стоит помещать бизнес-логику в триггеры.

...