如何在修改其中一条记录并更新新日期后为同一记录创建新行?

时间:2017-11-29 02:54:50

标签: oracle

我正在尝试这样做,以便当我从记录中更改描述时,该表将自动添加一个新记录,其中包含与之前记录相同的数据但具有新描述的新PRODUCTKEY值。此新记录还将更新日期,以便新的开始日期将成为上一个结束日期,新的结束日期将成为SYSDATE,即上次修改记录的日期。

我已将我的桌子合并在一起但是MERGING只更改了所有日期并且没有添加新记录。我不知道接下来要做什么。

这是一个例子: enter image description here

这是我的代码:

CREATE TABLE PRODUCT_DIM
(
    PRODUCTKEY integer NOT NULL,
    PRODUCTID integer,
    PRODUCTDESCRIPTION VARCHAR2(50 BYTE),
    PRODUCTLINEID integer,
    PRODUCTLINENAME VARCHAR2(50 BYTE),
    CONSTRAINT PRODUCT_DIM_PK PRIMARY KEY (PRODUCTKEY)
);

ALTER TABLE PRODUCT_DIM
ADD EFF_START_DATE DATE DEFAULT '27-NOV-17';

ALTER TABLE PRODUCT_DIM 
ADD EFF_END_DATE DATE DEFAULT '27-NOV-17';

CREATE SEQUENCE PRODUCT_KEY_SEQ
  MINVALUE 1001
  START WITH 1001
  INCREMENT BY 1
  CACHE 25;


INSERT INTO PRODUCT_DIM
(PRODUCTKEY, PRODUCTID, PRODUCTDESCRIPTION, PRODUCTLINEID, PRODUCTLINENAME)
SELECT PRODUCT_KEY_SEQ.NEXTVAL, nvl(to_char(p.PRODUCTID), 'Undefined'), nvl(to_char(p.PRODUCTDESCRIPTION), 'Undefined'),
nvl(to_char(p.PRODUCTLINEID), 'Undefined'), nvl(to_char(pl.PRODUCTLINENAME), 'Undefined')
FROM PRODUCTLINE_T pl, PRODUCT_T p
WHERE p.PRODUCTLINEID = pl.PRODUCTLINEID;

INSERT INTO PRODUCT_DIM
(PRODUCTKEY, PRODUCTID, PRODUCTDESCRIPTION, PRODUCTLINEID, PRODUCTLINENAME)
VALUES (PRODUCT_KEY_SEQ.NEXTVAL, -99, 'Undefined', -99, 'Undefined');

CREATE TABLE PRODUCT_DIM_HIS
(
    PRODUCTKEY integer NOT NULL,
    PRODUCTID integer,
    PRODUCTDESCRIPTION VARCHAR2(50 BYTE),
    PRODUCTLINEID integer,
    PRODUCTLINENAME VARCHAR2(50 BYTE),
    EFF_START_DATE DATE,
    EFF_END_DATE DATE,
    CONSTRAINT PRODUCT_DIM_HIS_PK PRIMARY KEY (PRODUCTKEY)
);


INSERT INTO PRODUCT_DIM_HIS
(PRODUCTKEY, PRODUCTID, PRODUCTDESCRIPTION, PRODUCTLINEID, PRODUCTLINENAME, EFF_START_DATE, EFF_END_DATE)
SELECT PRODUCT_KEY_SEQ.NEXTVAL, nvl(to_char(p.PRODUCTID), 'Undefined'), nvl(to_char(p.PRODUCTDESCRIPTION), 'Undefined'),
nvl(to_char(p.PRODUCTLINEID), 'Undefined'), nvl(to_char(pl.PRODUCTLINENAME), 'Undefined'), 
to_date(o.ORDERDATE), to_date(o.FULFILLMENTDATE)
FROM PRODUCTLINE_T pl, PRODUCT_T p, ORDER_T o, ORDERLINE_T ol
WHERE p.PRODUCTLINEID = pl.PRODUCTLINEID
AND o.ORDERID = ol.ORDERID 
AND ol.PRODUCTID = p.PRODUCTID;

MERGE INTO PRODUCT_DIM_HIS pdh
    USING PRODUCT_DIM pd 
        ON (pdh.PRODUCTID = pd.PRODUCTID) 
    WHEN MATCHED THEN 
    UPDATE SET 
        EFF_START_DATE = pd.EFF_START_DATE, 
        EFF_END_DATE = SYSDATE;

1 个答案:

答案 0 :(得分:0)

您需要编写程序代码来管理它。有各种选择。

一种方法是使用存储过程来包装更新和插入实现。这可能是最干净的方法;如果您需要批量执行此操作,这绝对是一种方法。

或者写一个触发器,在更改源表时填充历史表。

如果您使用的是Enterprise Edition 11.2.0.4或更高版本,则可以使用内置的闪回数据存档功能,该功能可以透明地维护历史记录表。 Find out more

哪种方法最好取决于您希望如何使用历史记录表。