2016-10-30 101 views
0

所以我想創建一個改變記錄時間戳的觸發,我有這個迄今爲止的Oracle SQL觸發錯誤: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語句忽略

通過它的聲音,它不認爲我的if語句已經關好,但我不知道在哪裏,我出了錯

+1

它看起來像jobs.closing_date和jobs.start_date是'日期'列。如果是這樣,你的'to_date(to_date('應該是'to_date(to_char(' - 你想把日期轉換成DD/MON/YYYY格式的字符串以便追加''23:59:59'並將其轉換回日期(可能更容易「trunc」它,加1並減去'interval'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