Старое значение и новое значение записи после обновления - PullRequest
1 голос
/ 09 февраля 2020

Мне нужно создать хранимую процедуру, которая обнаружит старое значение и новое значение обновленной записи. Он должен включать в себя запрос Dynami c для поиска имени столбца во время выполнения.

Для этого я использую oracle 12 C.

create table student (    
    id number(6) primary key,
    name varchar2(50),
    city varchar2(50),
    address varchar2(100),
    createdDateTime date,
    updatedDatetime date
);

insert into student values(1,'abc1','abc1','abc1','09-Jan-20','12-Jan-20');
insert into student values(2,'pqr','pqr','pqr','09-Jan-20',null);

таблица ученика-

ID      Name    City     Address    Create_time UpdatedTime
1       abc1    abc1     abc1       09-Jan-20   12-Jan-20
2       pqr     pqr      pqr        09-Jan-20   null

create table studentHistory (
    id number(6) ,
    name varchar2(50),
    city varchar2(50),
    address varchar2(100),
    DatetimeCreated date
);

insert into StudentHistory values(1,null,'abc',null,'10-Jan-20');
insert into StudentHistory values(1,'abc',null,null,'11-Jan-20');
insert into StudentHistory values(1,null,null,'abc','12-Jan-20');

Таблица истории учащегося -

ID  Name    City        Address DatetimeCreated
1   null    abc          null     10-Jan-20
1   abc     null         null     11-Jan-20
1   null    null         abc      12-Jan-20

Требуемый результат ->

Id  ColumnName Old Value New Value Updatetime
1   City        abc         abc1    '10-01-20'
1   name        abc         abc1    '11-01-20'
1   City        abc         abc1    '12-01-20'

1 Ответ

0 голосов
/ 09 февраля 2020

Я согласен с @stickybit. Заполнение таблицы истории - это действительно отправная точка. Вы должны создать триггер, как упомянуто @Littlefoot, для обновления / вставки в вашу таблицу истории, возможно, используя слияние https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9016.htm#SQLRF01606

Но я попробовал что-то только на основе предоставленных вами данных, дон Не думаю, что это то, что вы ищете, но все еще публикуете это здесь, поскольку это может помочь кому-то еще в будущем:

with name_cte
as
(
select 
a.id,
a.name as new_value,
b.name as old_value,
b.datetimecreated,
'name' as column_name
from student a
join studenthistory b
on a.id=b.id
and b.name is not null
)
,city_cte
as
(
select 
a.id,
a.city as new_value,
b.city as old_value,
b.datetimecreated,
'city' as column_name
from student a
join studenthistory b
on a.id=b.id
and b.city is not null
)
,address_cte
as
(
select 
a.id,
a.address as new_value,
b.address as old_value,
b.datetimecreated,
'address' as column_name
from student a
join studenthistory b
on a.id=b.id
and b.address is not null
)
select 
a.id,
a.column_name,
a.old_value,
a.new_value,
a.datetimecreated as updatetime
from name_cte a
union all
select
b.id,
b.column_name,
b.old_value,
b.new_value,
b.datetimecreated as updatetime
from city_cte b
union all
select
c.id,
c.column_name,
c.old_value,
c.new_value,
c.datetimecreated as updatetime
from address_cte c

демо

...