获取无效月份,需要增量插入记录
Getting a not valid month and need to insert records in incremental manner
CREATE TABLE deligate_details_main (
e_id NUMBER(10),completed_date timestamp,
CONSTRAINT pk_deligate_details_main PRIMARY KEY ( e_id )
);
INSERT INTO deligate_details_main VALUES(1,current_timestamp);
INSERT INTO deligate_details_main VALUES(2,current_timestamp);
INSERT INTO deligate_details_main VALUES(3,current_timestamp);
CREATE SEQUENCE deligate_details_trans_sq;
CREATE TABLE deligate_details_trans (
d_id NUMBER(10),
e_id NUMBER(10),
completed_date_trans date,
CONSTRAINT pk_deligate_details_trans PRIMARY KEY ( d_id ),
CONSTRAINT fk_e_id FOREIGN KEY ( e_id )
REFERENCES deligate_details_main ( e_id )
);
insert into deligate_details_trans(d_id,e_id,completed_date_trans)
select deligate_details_trans_sq.nextval,
e_id,
to_date(completed_date,'DD-MON-YY') from deligate_details_main;
我面临的问题:
我需要将时间戳转换为日期,然后将其插入 deligate_details_trans 中 deligate_details_main table 的 completed_date 列。当我转换时,它给出了 ORA-01843: not a valid month 错误。
目前,deligate_details_main 有 3 行要插入 deligate_details_trans table,但如果有任何行插入 deligate_details_main table 说 e_id 4 在插入 deligate_details_trans table 之后被插入。然后当我将 运行 插入查询时,它应该将 e_id 4 附加到 deligate_details_trans table
deligate_details_main table 中有 3 条记录时的预期输出:
+------+------+----------------------+
| D_ID | E_ID | completed_date_trans |
+------+------+----------------------+
| 1 | 1 | 13-Dec-21 |
| 2 | 2 | 13-Dec-21 |
| 3 | 3 | 13-Dec-21 |
+------+------+----------------------+
当 e_id 被添加到 deligate_details_main table
INSERT INTO deligate_details_main VALUES(4,current_timestamp);
那么输出应该是:
+------+------+----------------------+
| D_ID | E_ID | completed_date_trans |
+------+------+----------------------+
| 1 | 1 | 13-Dec-21 |
| 2 | 2 | 13-Dec-21 |
| 3 | 3 | 13-Dec-21 |
| 4 | 4 | 13-Dec-21 |
+------+------+----------------------+
你只需要在 completed_date
上 TRUNC
,我会说。
SQL> INSERT INTO deligate_details_trans (d_id, e_id, completed_date_trans)
2 SELECT deligate_details_trans_sq.NEXTVAL, e_id, TRUNC (completed_date)
3 FROM deligate_details_main;
3 rows created.
SQL> alter session set nls_date_format = 'dd.mm.yyyy';
Session altered.
SQL> SELECT * FROM deligate_details_trans;
D_ID E_ID COMPLETED_
---------- ---------- ----------
4 1 13.12.2021
5 2 13.12.2021
6 3 13.12.2021
SQL>
要插入 deligate_details_trans
自动 ,您需要一个数据库 trigger:
SQL> CREATE OR REPLACE TRIGGER trg_ai_ddm
2 AFTER INSERT
3 ON deligate_details_main
4 FOR EACH ROW
5 BEGIN
6 INSERT INTO deligate_details_trans (d_id, e_id, completed_date_trans)
7 VALUES (deligate_details_trans_sq.NEXTVAL,
8 :new.e_id,
9 TRUNC (:new.completed_date));
10 END trg_ai_ddm;
11 /
Trigger created.
我们来测试一下:
SQL> INSERT INTO deligate_details_main VALUES(4,current_timestamp);
1 row created.
SQL> SELECT * FROM deligate_details_trans;
D_ID E_ID COMPLETED_
---------- ---------- ----------
4 1 13.12.2021
5 2 13.12.2021
6 3 13.12.2021
7 4 13.12.2021 --> here it is!
SQL>
CREATE TABLE deligate_details_main (
e_id NUMBER(10),completed_date timestamp,
CONSTRAINT pk_deligate_details_main PRIMARY KEY ( e_id )
);
INSERT INTO deligate_details_main VALUES(1,current_timestamp);
INSERT INTO deligate_details_main VALUES(2,current_timestamp);
INSERT INTO deligate_details_main VALUES(3,current_timestamp);
CREATE SEQUENCE deligate_details_trans_sq;
CREATE TABLE deligate_details_trans (
d_id NUMBER(10),
e_id NUMBER(10),
completed_date_trans date,
CONSTRAINT pk_deligate_details_trans PRIMARY KEY ( d_id ),
CONSTRAINT fk_e_id FOREIGN KEY ( e_id )
REFERENCES deligate_details_main ( e_id )
);
insert into deligate_details_trans(d_id,e_id,completed_date_trans)
select deligate_details_trans_sq.nextval,
e_id,
to_date(completed_date,'DD-MON-YY') from deligate_details_main;
我面临的问题:
我需要将时间戳转换为日期,然后将其插入 deligate_details_trans 中 deligate_details_main table 的 completed_date 列。当我转换时,它给出了 ORA-01843: not a valid month 错误。
目前,deligate_details_main 有 3 行要插入 deligate_details_trans table,但如果有任何行插入 deligate_details_main table 说 e_id 4 在插入 deligate_details_trans table 之后被插入。然后当我将 运行 插入查询时,它应该将 e_id 4 附加到 deligate_details_trans table
deligate_details_main table 中有 3 条记录时的预期输出:
+------+------+----------------------+
| D_ID | E_ID | completed_date_trans |
+------+------+----------------------+
| 1 | 1 | 13-Dec-21 |
| 2 | 2 | 13-Dec-21 |
| 3 | 3 | 13-Dec-21 |
+------+------+----------------------+
当 e_id 被添加到 deligate_details_main table
INSERT INTO deligate_details_main VALUES(4,current_timestamp);
那么输出应该是:
+------+------+----------------------+
| D_ID | E_ID | completed_date_trans |
+------+------+----------------------+
| 1 | 1 | 13-Dec-21 |
| 2 | 2 | 13-Dec-21 |
| 3 | 3 | 13-Dec-21 |
| 4 | 4 | 13-Dec-21 |
+------+------+----------------------+
你只需要在 completed_date
上 TRUNC
,我会说。
SQL> INSERT INTO deligate_details_trans (d_id, e_id, completed_date_trans)
2 SELECT deligate_details_trans_sq.NEXTVAL, e_id, TRUNC (completed_date)
3 FROM deligate_details_main;
3 rows created.
SQL> alter session set nls_date_format = 'dd.mm.yyyy';
Session altered.
SQL> SELECT * FROM deligate_details_trans;
D_ID E_ID COMPLETED_
---------- ---------- ----------
4 1 13.12.2021
5 2 13.12.2021
6 3 13.12.2021
SQL>
要插入 deligate_details_trans
自动 ,您需要一个数据库 trigger:
SQL> CREATE OR REPLACE TRIGGER trg_ai_ddm
2 AFTER INSERT
3 ON deligate_details_main
4 FOR EACH ROW
5 BEGIN
6 INSERT INTO deligate_details_trans (d_id, e_id, completed_date_trans)
7 VALUES (deligate_details_trans_sq.NEXTVAL,
8 :new.e_id,
9 TRUNC (:new.completed_date));
10 END trg_ai_ddm;
11 /
Trigger created.
我们来测试一下:
SQL> INSERT INTO deligate_details_main VALUES(4,current_timestamp);
1 row created.
SQL> SELECT * FROM deligate_details_trans;
D_ID E_ID COMPLETED_
---------- ---------- ----------
4 1 13.12.2021
5 2 13.12.2021
6 3 13.12.2021
7 4 13.12.2021 --> here it is!
SQL>