powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Архивирование связанных таблиц в многопользовательском режиме
6 сообщений из 6, страница 1 из 1
Архивирование связанных таблиц в многопользовательском режиме
    #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
Архивирование связанных таблиц в многопользовательском режиме
    #39584669
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Параллельная сессия фиксирует запись в workflow между delete from workflow и delete from tasks
2. row-by-row = slow-by-slow (c)
...
Рейтинг: 0 / 0
Архивирование связанных таблиц в многопользовательском режиме
    #39584675
tester99,

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

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

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

И так, в принципе, сойдёт, но надо обязательно озаботиться TIL круче, чем обычный read
committed. Хотя, возможно, подразумевается, что его надо эмулировать хитвовывернутыми bulk
collect.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Архивирование связанных таблиц в многопользовательском режиме
    #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
6 сообщений из 6, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Архивирование связанных таблиц в многопользовательском режиме
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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