插入日期范围并且应该与另一列唯一
Insert a range of dates and should be unique with another column
我有table
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;
如何向 kurs_id 插入数据,其中仅包含一个数字“1”
和 datekurs 将包含从 2017 年 1 月 1 日到 2017 年 1 月 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
/
这将按顺序插入所有日期
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
这个技巧生成 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
/
"not enough values"
您更改了目标的结构 table 因此您需要更改查询的投影以匹配。修订版包括额外的主键列。
"i want to use my trigger for new column kurs_number"
您可以使用 kurs_id
和目标年份的参数使其成为一个过程。
作为奖励,这段代码可以正确处理闰年。
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;
要从触发器调用,您需要以某种方式传递参数,大概使用触发器的 table.
中的值
我有table
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;
如何向 kurs_id 插入数据,其中仅包含一个数字“1” 和 datekurs 将包含从 2017 年 1 月 1 日到 2017 年 1 月 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
/
这将按顺序插入所有日期
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
这个技巧生成 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
/
"not enough values"
您更改了目标的结构 table 因此您需要更改查询的投影以匹配。修订版包括额外的主键列。
"i want to use my trigger for new column kurs_number"
您可以使用 kurs_id
和目标年份的参数使其成为一个过程。
作为奖励,这段代码可以正确处理闰年。
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;
要从触发器调用,您需要以某种方式传递参数,大概使用触发器的 table.
中的值