powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Обновление
9 сообщений из 9, страница 1 из 1
Обновление
    #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
Обновление
    #39840946
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vgpframedЕсть таблица, на основе которой формируется другая
проходили уже
...
Рейтинг: 0 / 0
Обновление
    #39840950
vgpframed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
123йй,
это продолжение.
...
Рейтинг: 0 / 0
Обновление
    #39840952
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vgpframed,

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

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

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

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

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


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


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