插入一系列日期,应该在另一列中是唯一的



我有表

CREATE TABLE T_TEST 
( KURS_NUMBER NUMBER PRIMARY KEY,
 KURS_ID NUMBER NOT NULL, 
DATEKURS DATE NOT NULL,
 CONSTRAINT UNIQUE2 UNIQUE
 (KURS_ID,DATEKURS)
 );

kurs_number的触发

create or replace trigger TR_INSERT_TEST01
  before insert on test01  
  FOR EACH ROW
declare
  -- local variables here
begin
  IF :NEW.KURS_NUMBER IS NULL
    THEN SELECT SEQ_TEST.NEXTVAL INTO :NEW.KURS_NUMBER FROM DUAL;
    END IF;
end TR_INSERT_T_TEST;

我如何将数据插入仅包含一个数字'1'的kurs_idDatekurs将在2017年1月1日至2017年12月31日(或随机日期)

中包含日期。
connect by level 365

此代码运行良好,但是如果我想将触发器用于新的列kurs_number,则无法正常工作(不够值)。我想那应该是不同的。

insert into t_test 
select 1 
       , date '2017-01-01' + (level-1)
from dual
connect by level <= 365
/

此技巧生成365行。我们可以使用日期进行算术,因此将(level-1)添加到根日期中会生成365个日期。

insert into t_test 
select SEQ_TEST.NEXTVAL
       , 1 
       , date '2017-01-01' + (level-1)
from dual
connect by level <= 365
/

"不够的值"

您更改了目标表的结构,因此您需要更改查询的投影以匹配。修订版的版本包括其他主键列。


"我想将我的触发器用于新列kurs_number"

您可以将其作为kurs_id和目标年度参数的过程。作为奖励,此代码正确处理LEAP年。

create or replace procedure generate_kurs_year_recs
    ( p_kurs_id in number
      , p_kurs_year in varchar2 )
is
    last_dayno number;
begin
    /* find number of days in year */
    select to_number(to_char(to_date( p_kurs_year||'-12-31', 'yyyy-mm-dd')
                    , 'DDD'))
    into last_dayno
    from dual;
    /* generate records for year */
    insert into t_test 
        select SEQ_TEST.NEXTVAL
               , p_kurs_id 
               , to_date( p_kurs_year||'-01-01', 'yyyy-mm-dd') + (level-1)
        from dual
        connect by level <= last_dayno;
end generate_kurs_year_recs;
/

这样调用该过程:

begin
    generate_kurs_year_recs(1,'2017');
end;

要从触发器调用您需要以某种方式传递参数,大概是使用扳机表中的值。

这将插入所有日期

insert into t_test (kurs_id, datekurs)
with CTE (DD) as
(
select to_date('20170101','YYYYMMDD') as DD
from dual
union
select DD +1
from CTE
where DD < to_date('20171231','YYYYMMDD')
)
select  row_number() over(order by DD) as kurs_id, DD as datekurs
from CTE

最新更新