获取无效月份,需要增量插入记录

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;

我面临的问题:

  1. 我需要将时间戳转换为日期,然后将其插入 deligate_details_trans 中 deligate_details_main table 的 completed_date 列。当我转换时,它给出了 ORA-01843: not a valid month 错误。

  2. 目前,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_dateTRUNC,我会说。

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>