Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Архивирование связанных таблиц в многопользовательском режиме / 6 сообщений из 6, страница 1 из 1
15.01.2018, 18:59
    #39584665
tester99
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Архивирование связанных таблиц в многопользовательском режиме
Задача:
Задача:Создать архивные таблицы такой же структуры, что таблица задач («задача») и таблица, связующая задачи и сотрудников («задача-сотрудник»). Написать функцию, перемещающую записи из основных таблиц («задача» и «задача-сотрудник») в соответствующие архивные таблицы и работающую в многопользовательском режиме. В качестве параметра функция получает дату, которая указывает, что задачи, завершенные до этой даты должны быть перенесены в архив. Функция возвращает 0, если в архивные таблицы была перенесена хотя бы 1 задача; функция возвращает 1, если не было перенесено ни одной задачи и возвращает 2, если при выполнении возникла ошибка.

Решение:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
Не архивные таблицы такой же структуры как и архивные:
create table tasks_arch (task_id number not null,
                         task_name varchar2(200) not null,
                         start_date date,
                         stop_date  date,
                         description varchar2(200),
                         manager_id number);
create table workflow_arch(task_id number not null,
                           employee_id number not null);



Код: 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.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
declare
  p_start_date date := to_date('11.10.2019', 'dd.mm.yyyy');
  lr_tasks tasks%rowtype;
begin
  for rec_all_tasks in (select rowid, task_id
                        from tasks t
                        where t.start_date < (p_start_date)+1
                       )
  loop
    begin
      SavePoint sp_before_tasks;

      select *
      into lr_tasks
      from tasks t
      where t.rowid = rec_all_tasks.rowid
      for update nowait;

      begin

        insert into tasks_arch(task_id,
                               task_name,
                               start_date,
                               stop_date,
                               description,
                               manager_id)
        select task_id,
               task_name,
               start_date,
               stop_date,
               description,
               manager_id  
        from tasks t
        where t.task_id = lr_tasks.task_id;

        insert into workflow_arch(task_id, employee_id)
        select task_id, employee_id
          from workflow w
         where w.task_id = lr_tasks.task_id;

        delete from workflow w
        where w.task_id = lr_tasks.task_id;

        delete from tasks t
        where t.rowid = rec_all_tasks.rowid;

      exception
        when no_data_found then

          rollback to sp_before_tasks;
          continue;
      end;
      
    exception
      when others then
        rollback to sp_before_tasks;
    end;

  end loop;

  commit;
end;
...
Рейтинг: 0 / 0
15.01.2018, 19:12
    #39584669
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Архивирование связанных таблиц в многопользовательском режиме
1. Параллельная сессия фиксирует запись в workflow между delete from workflow и delete from tasks
2. row-by-row = slow-by-slow (c)
...
Рейтинг: 0 / 0
15.01.2018, 19:20
    #39584675
Архивирование связанных таблиц в многопользовательском режиме
tester99,

а вопрос-то в чем?
мы же не знаем, кто и как будет тебя проверять... может ему "и так сойдет"(с) ?
...
Рейтинг: 0 / 0
15.01.2018, 19:57
    #39584689
tester99
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Архивирование связанных таблиц в многопользовательском режиме
andrey_anonymous,

Я так понимаю, что многопользовательский режим только через эту процедуру. Т.е. вторая сессия не получит блокировку еще на таблицу tasks и до delete не дойдет.

Вопрос в том, правильно ли так реализовывать?
...
Рейтинг: 0 / 0
15.01.2018, 22:04
    #39584720
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Архивирование связанных таблиц в многопользовательском режиме
tester99Вопрос в том, правильно ли так реализовывать?

И так, в принципе, сойдёт, но надо обязательно озаботиться TIL круче, чем обычный read
committed. Хотя, возможно, подразумевается, что его надо эмулировать хитвовывернутыми bulk
collect.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.01.2018, 16:39
    #39585255
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Архивирование связанных таблиц в многопользовательском режиме
tester99Я так понимаю, что многопользовательский режим только через эту процедуру.
Это вряд ли.
Процедура архивирования не может быть единственным процессом, использующим данные.
Правильно организовать - по учебнику.
Изучите главу data concurency and consistency концептов.
Прочитайте application development guide.
Рассматривайте различные варианты конкурирующей нагрузки - от простых select до dml и, если хватит силенок, ddl.
Начните с блокировки заданий, с которыми предполагается работать в процедуре.
Есть несколько "букварных" способов, исследуйте их (блокировка всей таблицы, блокировка требуемой строки двумя способами, кастомная блокировка). Выберите наиболее подходящий к задаче вариант.
Рассмотрите варианты наличия/отсутствия FK, наличия/отсутствия индекса на FK, различные варианты "on delete".
Изучите отложенную (deferrable ... deferred) проверку ограничений целостности и примените к задаче.
Изучите вариант переноса данных посредством dml returning value.
Научитесь корректно обрабатывать исключительные ситуации.
В итоге получите 5-10 вариантов решения задачи и неплохой начальный скилл в области разработки вообще и Oracle-разработки в частности.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Архивирование связанных таблиц в многопользовательском режиме / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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