oracle SQL触发器是否在INSERT时用当前日期替换表中的空值?

kjthegm6  于 2022-11-03  发布在  Oracle
关注(0)|答案(3)|浏览(175)

我正在编写一个触发器,用来替换插入到Appointments表的datesDATE类型)列中的任何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查询示例(NULL值对应于dates列)如下所示:

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

我的appointments表只有4列:patient_IDfirst_namelast_namedates
理想情况下,最终结果应在appointments表中插入一个新行,如下所示:
一个|若翰|多伊|2017年4月21日
用当前日期替换NULL

EDIT:不允许我更改任何原始表结构,包括DEFAULT值,否则我一开始就不需要问这个问题......

kcrjzv8t

kcrjzv8t1#

  • 编辑 * 如果没有now()的同义词,则此now()解决方案不起作用。

如果日期为NULL,则可以使用COALESCE:NEW日期替换为NOW()日期,否则将其保留:

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;
/
hfyxw5xn

hfyxw5xn2#

(
  CASE 
    WHEN 
      to_char((JOINING_DATE),'DD-MON-YYYY') IS NOT NULL 
    THEN 
      to_char((JOINING_DATE),'DD-MON-YYYY') 
    ELSE 
      '-' 
  END
)
6qftjkof

6qftjkof3#

Oracle数据库中没有NOW()函数,您可以使用SYSDATE或CURRENT_DATE。这两个函数之间的区别在于以下[Oracle社区链接]。(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;

相关问题