2016-10-30 5 views
0

Так что я пытаюсь создать триггер, который изменяет с записями метку времени, у меня это до сих порOracle SQL Trigger ошибка: ORA-00933

create or replace TRIGGER job_date_set 
     AFTER INSERT OR UPDATE OF start_date, closing_date ON jobs 
     FOR EACH ROW 
    BEGIN 
     IF UPDATING THEN 
     CASE 
      WHEN :OLD.closing_date != :NEW.closing_date THEN 
      UPDATE jobs 
      SET closing_date = to_date(to_date(:NEW.closing_date,'DD/MON/YYYY')||' 23:59:59','DD/MON/YYYY HH24:MI:SS') 
      WHERE :OLD.job_id = job_id; 
      WHEN :OLD.start_date != :NEW.start_date THEN 
      UPDATE jobs 
      SET start_date = to_date(to_date(:NEW.start_date,'DD/MON/YYYY') ||' 00:00:00','DD/MON/YYYY HH24:MI:SS') 
      WHERE :OLD.job_id = job_id; 
     END CASE; 
     END IF; 
     IF INSERTING THEN 
     UPDATE jobs 
     SET closing_date = to_date(to_date(:NEW.closing_date,'DD/MON/YYYY') ||' 23:59:59','DD/MON/YYYY HH24:MI:SS') 
     SET start_date = to_date(to_date(:NEW.start_date,'DD/MON/YYYY')||' 00:00:00','DD/MON/YYYY HH24:MI:SS') 
     WHERE :OLD.job_id = job_id; 
     END IF; 
    END; 

Вот описание ошибок: компиляции не удалось, строка 17 (16:54:27) Номера строк, связанные с ошибками компиляции, относятся к первому оператору BEGIN. Это влияет только на компиляцию триггеров базы данных. PL/SQL: ORA-00933: команда SQL не выполнена должным образом. Ошибка компиляции, строка 15 (16:54:27) Номера строк, связанные с ошибками компиляции, относятся к первому оператору BEGIN. Это влияет только на компиляцию триггеров базы данных. PL/SQL: SQL заявление игнорировали

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

+1

Похоже, что jobs.closing_date и jobs.start_date являются столбцами 'date'. Если это так, ваш 'to_date (to_date (' должен быть 'to_date (to_char (' - вы хотите преобразовать дату в строку символов в формате DD/MON/YYYY, чтобы добавить '23: 59: 59'' в он и преобразует его обратно в дату. (Может быть проще «trunc» его, добавить 1 и вычесть «интервал» 1 «второй».) –

ответ

1

Вместо:

UPDATE jobs 
    SET closing_date = to_date(to_date(:NEW.closing_date,'DD/MON/YYYY') ||' 23:59:59','DD/MON/YYYY HH24:MI:SS') 
    SET start_date = to_date(to_date(:NEW.start_date,'DD/MON/YYYY')||' 00:00:00','DD/MON/YYYY HH24:MI:SS') 
    WHERE :OLD.job_id = job_id; 

это:

UPDATE jobs 
    SET closing_date = to_date(to_date(:NEW.closing_date,'DD/MON/YYYY') ||' 23:59:59','DD/MON/YYYY HH24:MI:SS'), 
     start_date = to_date(to_date(:NEW.start_date,'DD/MON/YYYY')||' 00:00:00','DD/MON/YYYY HH24:MI:SS') 
    WHERE :OLD.job_id = job_id; 

Т.е. вместо запятой вместо запятой есть КНОПКА SET.

+0

Это была ошибка. – Zachary

1

Когда вы изменяете таблица, на которой установлен триггер, требуется до триггера обновления. Так, что-то вроде этого:

create or replace TRIGGER job_date_set 
    BEFORE INSERT OR UPDATE OF start_date, closing_date ON jobs 
    FOR EACH ROW 
BEGIN 
    IF UPDATING THEN 
    CASE 
     WHEN :OLD.closing_date <> :NEW.closing_date THEN 
     SELECT to_date(to_date(:NEW.closing_date,'DD/MON/YYYY')||' 23:59:59','DD/MON/YYYY HH24:MI:SS') 
     INTO :NEW.closing_date 
     FROM dual; 
     WHEN :OLD.start_date <> :NEW.start_date THEN 
     SELECT to_date(to_date(:NEW.start_date,'DD/MON/YYYY') ||' 00:00:00','DD/MON/YYYY HH24:MI:SS') 
     INTO :NEW.start_date 
     FROM dual; 
    END CASE; 
    END IF; 
    IF INSERTING THEN 
    SELECT to_date(to_date(:NEW.closing_date,'DD/MON/YYYY') ||' 23:59:59','DD/MON/YYYY HH24:MI:SS'), 
      to_date(to_date(:NEW.start_date,'DD/MON/YYYY')||' 00:00:00','DD/MON/YYYY HH24:MI:SS') 
    INTO :NEW.closing_date, :NEW.start_date; 
    END IF; 
END; 
+0

Я думаю, что мой план состоял в том, чтобы иметь триггер перед вставкой, который вставляет автоматический приращение , поэтому мне пришлось бы отредактировать дату после, как вы думаете, было бы лучше включить этот код в этот триггер или иметь два отдельных триггера, выполняющих две разные задачи? – Zachary