在插入表格ORACLE 10g之前检查日期

时间:2017-01-31 08:46:48

标签: oracle

我有桌子:

BOOK_DT1     BOOK_DT2   USERNAME

---------   ---------  --------------------

22-SEP-17    12-OCT-17  rSK

08-FEB-16    18-FEB-16  chak

05-JAN-17    12-JAN-17  rah

31-JAN-16    01-JUL-16  ABC

插入另一列时,应该检查BOOK_DT1的给定日期,BOOK_DT2不应该进入表格中的日期。

对于EX:insert into table_name('28-SEP-17','12-NOV-17','XYX');应该抛出错误,因为' 28-SEP-17'介于22-SEP-17和12-OCT-17之间。

2 个答案:

答案 0 :(得分:0)

您可以使用after insert触发器来实现此目的。像这样闷闷不乐:

create or replace trigger date_check_trg 
after insert 
on your_table_name
 v_cnt NUMBER;
begin
  select count(*) 
  into v_cnt
  from  you_table_name t1
  join you_table_name t2
   on ( t1.BOOK_DT1 between t2.BOOK_DT1 and t2.BOOK_DT1
       or t1.BOOK_DT2 between t2.BOOK_DT1 and t2.BOOK_DT1
      )
  AND t1.rowid != t2.rowid
  ;

  if v_cnt > 0 then 
    raise_application_error(-20999, 'intersection error'); 
  end if;
end;
/

答案 1 :(得分:0)

如果您想在插入之前进行检查,那么BEFORE INSERT应该是您正在寻找的内容。如果名称没有关系,并且您的新值不应该介于之前插入表中的任何值之间,那么我就是这样写的:

create or replace trigger trg_date_chk
before insert 
on your_table_name for each row
declare
  lnCnt NUMBER;
begin
  select count(*) 
  into lnCnt
  from  you_table_name a
  where :new.BOOK_DT1 < a.BOOK_DT1
  and :new.BOOK_DT2 > a.BOOK_DT2;

if lnCnt > 0 then 
raise_application_error(-20999, 'INSERT ERROR HERE'); 
end if;
end;
/