我目前有一张包含以下布局的表格:
create table x (
insert_date date DEFAULT sysdate,
last_update_date date,
expiration_date date
)
如果我写这个表,insert_date的值显然是它写入的确切时间。我的问题是,有没有办法为expiration_date设置一个默认值,即字面上只是" sysdate + 1年" ?
答案 0 :(得分:2)
您可以使用ADD_MONTHS功能。
示例:
create table x2 (
insert_date date DEFAULT sysdate,
LAST_UPDATE_DATE date,
EXPIRATION_DATE date DEFAULT add_months(sysdate, 12)
);
insert into x2 (LAST_UPDATE_DATE) values (TO_DATE('2017-11-17', 'YYYY-MM-DD'));
commit;
以下是使用触发器的示例。
create or replace trigger x2_TX
before insert on x2 for each row
begin
:new.EXPIRATION_DATE := ADD_MONTHS(sysdate, 12);
end;
Stilgar有一个很好的观点,我的第一个例子不是"开发者安全"相对于第二个。为了简单起见,我会建议前者,现在我会做你团队中最好的做法。
答案 1 :(得分:1)
如果是DEFAULT SYSDATE
,您可以编写BEFORE INSERT TRIGGER
代替null
来获取已通过的日期值或执行日期。
SET DEFINE OFF
CREATE OR REPLACE TRIGGER tr_x BEFORE INSERT ON x
FOR EACH ROW
BEGIN
:new.insert_date := NVL(:new.insert_date,SYSDATE);
:new.expiration_date := :new.insert_date + INTERVAL '1' YEAR;
END;
/