簡體   English   中英

SQL 觸發以在插入時用當前日期替換表中的 Null 值?

[英]SQL Trigger To Replace Null Values in table with Current Date on INSERT?

我正在編寫一個觸發器,用於替換插入到我的Appointments表的dates (類型為DATE )列中的任何NULL值。 但我不知道如何插入當前日期。

我的觸發代碼:

CREATE OR REPLACE TRIGGER appointment_date_insert
BEFORE INSERT
ON appointments
FOR EACH ROW
WHEN (NEW.dates IS NULL)
BEGIN
     :NEW.dates := NOW();
END;
/

上面給出了編譯器日志中的錯誤:

必須聲明 NOW()

我也嘗試使用GETDATE()而不是NOW()但它在編譯器日志中給出了與上面相同的錯誤。


要測試此觸發器,我的示例INSERT查詢的dates列值為NULL ,如下所示:

INSERT INTO appointments
VALUES (1, 'John', 'Doe', NULL);

我的appointments表只有 4 列: patient_IDfirst_namelast_namedates

理想情況下,最終結果應該在appointments表中插入一個新行,如下所示:

1 | 約翰 | 母鹿 | 04-21-2017

用當前日期替換NULL


編輯:不允許我更改任何原始表結構,包括DEFAULT值,否則我一開始就不需要問這個問題....

編輯這與解決方案now()無同義詞不工作了now()

如果日期為NULL ,則可以使用COALESCENOW()替換為:NEW日期,否則可以不使用它:

CREATE TABLE APPOINTMENTS(PATIENT_ID NUMBER, FIRST_NAME VARCHAR2(64), LAST_NAME VARCHAR2(64), DATES DATE);

CREATE OR REPLACE TRIGGER appointment_date_insert
BEFORE INSERT
  ON appointments
FOR EACH ROW
  BEGIN
    :NEW.dates := COALESCE(:NEW.DATES,NOW());
  END;
/

然后測試一下:

INSERT INTO appointments VALUES (1, 'John', 'Doe', NULL);
INSERT INTO appointments VALUES (2, 'Jane', 'Doe', SYSDATE - 100);

SELECT * FROM APPOINTMENTS;

PATIENT_ID  FIRST_NAME  LAST_NAME  DATES      
1           John        Doe        21-APR-17  
2           Jane        Doe        11-JAN-17  

作為NOW()替代方法,您可以考慮SYSDATE (或者,如果願意,可以考慮CURRENT_DATE

CREATE OR REPLACE TRIGGER appointment_date_insert
BEFORE INSERT
  ON appointments
FOR EACH ROW
  BEGIN
    :NEW.dates := COALESCE(:NEW.DATES,SYSDATE);
  END;
/
(
  CASE 
    WHEN 
      to_char((JOINING_DATE),'DD-MON-YYYY') IS NOT NULL 
    THEN 
      to_char((JOINING_DATE),'DD-MON-YYYY') 
    ELSE 
      '-' 
  END
)

oracle 數據庫中沒有 NOW() function,可以使用 SYSDATE 或 CURRENT_DATE。 兩個函數的區別在下面[Oracle Community link].( https://community.oracle.com/tech/developers/discussion/2217249/sysdate-vs-current-date#:~:text=sysdate%20is %20the%20current%20date, getting%20the%20result%20as%200. )!

您可以使用此代碼創建觸發器。

CREATE OR REPLACE TRIGGER appointment_date_insert BEFORE
  INSERT ON appointments FOR EACH ROW
  BEGIN
    IF inserting AND :NEW.dates IS NULL THEN
      :NEW.dates:= sysdate;
    END IF;
  END;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM