Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Обновление / 9 сообщений из 9, страница 1 из 1
24.07.2019, 13:36
    #39840941
vgpframed
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление
Здравствуйте! Подскажите, пожалуйста, как решить данную проблему?
Есть таблица, на основе которой формируется другая. Так вот. Теперь нужно обновить сформированную таблицу на основе изменений исходной, но только нужно учитывать обновления после отсчетной даты, например от '03.02.2018'.

код формирования таблиц:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
CREATE TABLE start_table(
  dt DATE,
  acc_from number,
  acc_to number,
  amt number);
insert into start_table values(TO_DATE('01.02.2018','dd.mm.yyyy'),140,200,100);
insert into start_table values(TO_DATE('02.02.2018','dd.mm.yyyy'),200,140,100);
insert into start_table values(TO_DATE('02.02.2018','dd.mm.yyyy'),100,140,100);
insert into start_table values(TO_DATE('03.02.2018','dd.mm.yyyy'),100,140,200);
insert into start_table values(TO_DATE('03.02.2018','dd.mm.yyyy'),140,200,200);
insert into start_table values(TO_DATE('01.02.2018','dd.mm.yyyy'),300,400,100);
insert into start_table values(TO_DATE('01.02.2018','dd.mm.yyyy'),400,300,100);
insert into start_table values(TO_DATE('02.02.2018','dd.mm.yyyy'),300,400,200);
insert into start_table values(TO_DATE('02.02.2018','dd.mm.yyyy'),400,300,200);
insert into start_table values(TO_DATE('05.05.2019','dd.mm.yyyy'),1,2,100);
insert into start_table values(TO_DATE('05.05.2019','dd.mm.yyyy'),2,1,100);
insert into start_table values(TO_DATE('06.06.2019','dd.mm.yyyy'),2,1,150);
insert into start_table values(TO_DATE('01.01.2018','dd.mm.yyyy'),300,400,100);


  --формирование end_table
  create table end_table(acc,bgn_dt, end_dt, amt) as
  (select acc,
       dt dt_from,
       lead(dt, 1, date '3999-12-31') over(partition by acc order by dt) dt_till,
       sum(amt) over(partition by acc order by dt) amt
  from (select acc,
               case (grouping(dt))
                 when 0 then
                  dt
                 else
                  date '1970-01-01'
               end dt,
               case (grouping(dt))
                 when 0 then
                  sum(amt)
                 else
                  0
               end amt
          from (select acc_from acc, dt, -amt amt
                  from start_table
                union all
                SELECT acc_to, dt, amt from start_table)
         group by acc, rollup(dt)
        having grouping(dt) = 1 or sum(amt) <> 0)
);



Примерные изменения:
Код: plsql
1.
2.
3.
delete from start_table where acc_from =100  and dt = '02.02.2018';

insert into start_table values(TO_DATE('03.01.2025','dd.mm.yyyy'),100,400,100);



Есть ограничения - максимум: 1 insert, 1 update,1 delete;
так же нужно через один merge.

Надеюсь на Вашу помощь. Спасибо!
...
Рейтинг: 0 / 0
24.07.2019, 13:54
    #39840946
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление
vgpframedЕсть таблица, на основе которой формируется другая
проходили уже
...
Рейтинг: 0 / 0
24.07.2019, 13:57
    #39840950
vgpframed
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление
123йй,
это продолжение.
...
Рейтинг: 0 / 0
24.07.2019, 14:00
    #39840952
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление
vgpframed,

а какой смысл в таблице end_table ?
...
Рейтинг: 0 / 0
24.07.2019, 14:03
    #39840955
vgpframed
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление
123йй,
можно сказать, что это своеобразные остатки от таблицы start_table по временным интервалам.
...
Рейтинг: 0 / 0
24.07.2019, 15:37
    #39841006
vgpframed
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление
Кто-нибудь, помогите пожалуйста!
...
Рейтинг: 0 / 0
24.07.2019, 17:08
    #39841055
кит северных морей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление
vgpframedКто-нибудь, помогите пожалуйста!

задача, которую вы пытаетесь решить, называется change data capture, и в зависимости от конкретной ситуации она может быть весьма нетривиальной.

например, вы удалили строку из start_table. процесс, который обновляет end_table, должен об этом откуда-то узнать.

какие у него есть варианты? навскидку не так много.
а) посмотреть в некий журнал операций, в котором будет написано, что строка была удалена.
б) догадаться об этом, каким-то образом сравнив end_table со start_table

выбор будет обусловлен множеством факторов, большинство из которых известны только вам. вряд ли вам тут сходу предложат готовое решение
...
Рейтинг: 0 / 0
24.07.2019, 17:33
    #39841063
maverick2104
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление
кит северных морейvgpframedКто-нибудь, помогите пожалуйста!
вы удалили строку из start_table. процесс, который обновляет end_table, должен об этом откуда-то узнать.


Думаю что триггером это сделать легче всего .
...
Рейтинг: 0 / 0
24.07.2019, 17:56
    #39841074
кит северных морей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление
maverick2104кит северных морейпропущено...

вы удалили строку из start_table. процесс, который обновляет end_table, должен об этом откуда-то узнать.


Думаю что триггером это сделать легче всего .

хорошо. вы сделали after insert for each row trigger. я загрузил в таблицу 300 миллионов строк одной партией через insert+append. ваш триггер превратил direct path load в conventional load, загрузка заняла десять часов вместо десяти минут, мы нарушили SLA, нас всех уволили.

потом бизнес решил, что из 300 миллионов строк нужны только 150, и наш последователь решил удалить половину. он сделал это через CTAS+exchange partition. ваш after delete for each row trigger никогда об этом не узнал

нельзя говорить что легче, а что нет, не понимая, как устроены процессы в конкретной БД.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Обновление / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]