powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Using chains
5 сообщений из 5, страница 1 из 1
Using chains
    #39250825
Avotge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Немного почитал
DBMS_SCHEDULER
Using Chains
Система довольно гибкая похоже, но написано не для тупых )
Сходу не врубился в общем :/
Создаем цепочку из трех джобов:
Код: 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.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
-- табличка где будем смотреть результаты выполнения
create table tes (id number, beg_date date, end_date date);

-- процедурка, которую будут запускать джобы
create procedure test_proc(p_nm number)
is
begin
   insert into tes (id, beg_date) values (p_nm, sysdate);
   commit;   
   dbms_lock.sleep(60);
   update tes 
      set end_date = sysdate
    where id = p_nm;  
   commit;
end;

begin
   -- описываем программы
   -- программа для шага1 в цепочке
   dbms_scheduler.create_program(program_name => 'prog1',
                                 program_type => 'STORED_PROCEDURE',
                                 program_action => 'test_proc',
                                 number_of_arguments => 1,
                                 enabled => false);
   dbms_scheduler.define_program_argument(program_name => 'prog1',
                                          argument_position => 1,
                                          argument_name     => 'NM',
                                          argument_type     => 'NUMBER');
   dbms_scheduler.enable( 'prog1');
      
                                 
   -- программа для шага2 в цепочке
   dbms_scheduler.create_program(program_name => 'prog2',
                                 program_type => 'STORED_PROCEDURE',
                                 program_action => 'test_proc',
                                 number_of_arguments => 1,
                                 enabled => false);
   dbms_scheduler.define_program_argument(program_name => 'prog2',
                                          argument_position => 1,
                                          argument_name     => 'NM',
                                          argument_type     => 'NUMBER');
   dbms_scheduler.enable( 'prog2');    
                                 
                                 
   -- программа для шага3 в цепочке
   dbms_scheduler.create_program(program_name => 'prog3',
                                 program_type => 'STORED_PROCEDURE',
                                 program_action => 'test_proc',
                                 number_of_arguments => 1,
                                 enabled => false);
   dbms_scheduler.define_program_argument(program_name => 'prog3',
                                          argument_position => 1,
                                          argument_name     => 'NM',
                                          argument_type     => 'NUMBER');
   dbms_scheduler.enable( 'prog3');

   -- описываем джобы и задачем значения параметров
   -- джоб и параметр для шага1
   dbms_scheduler.create_job(job_name      => 'job1',
                             program_name  => 'prog1',
                             enabled       => FALSE);

   dbms_scheduler.set_job_anydata_value(job_name => 'job1',
                                        argument_name  => 'NM',
                                        argument_value => ANYDATA.CONVERTNUMBER(1));
   dbms_scheduler.enable('job1');

   -- джоб и параметр для шага2
   dbms_scheduler.create_job(job_name      => 'job2',
                             program_name  => 'prog2',
                             enabled       => FALSE);
                             
   dbms_scheduler.set_job_anydata_value(job_name => 'job2',
                                        argument_name  => 'NM',
                                        argument_value => ANYDATA.CONVERTNUMBER(2));
   dbms_scheduler.enable('job2');
   
   -- джоб и параметр для шага3
   dbms_scheduler.create_job(job_name      => 'job3',
                             program_name  => 'prog3',
                             enabled       => FALSE);
   dbms_scheduler.set_job_anydata_value(job_name => 'job3',
                                        argument_name  => 'NM',
                                        argument_value => ANYDATA.CONVERTNUMBER(3));
   dbms_scheduler.enable('job3');

   -- сама цепочка
   dbms_scheduler.create_chain (chain_name          => 'my_chain',
                                rule_set_name       => NULL,
                                evaluation_interval => NULL,
                                comments            => 'My first chain');

   -- добавляем шаги в цепочку
   dbms_scheduler.define_chain_step (chain_name      =>  'my_chain',
                                     step_name       =>  'step1',
                                     program_name    =>  'job1');
   dbms_scheduler.define_chain_step (chain_name      =>  'my_chain',
                                     step_name       =>  'step2',
                                     program_name    =>  'job2');
   dbms_scheduler.define_chain_step (chain_name      =>  'my_chain',
                                     step_name       =>  'step3',
                                     program_name    =>  'job3');
  -- включаем
  dbms_scheduler.enable(name => 'my_chain');
end;


Результат:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
SQL> select * from tes
  2  /
        ID BEG_DATE    END_DATE
---------- ----------- -----------
         3 05.06.2016  05.06.2016
         1 05.06.2016  05.06.2016
         2 05.06.2016  05.06.2016



Т.е. нормально работает.
Но. Пробуем запустить повторно:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SQL> begin
  2    dbms_scheduler.run_chain (chain_name    =>  'my_chain',
  3                              start_steps   =>  'step1, step2, step3');
  4  end;
  5  /
  
PL/SQL procedure successfully completed
-- результат
SQL> select * from tes
  2  /
        ID BEG_DATE    END_DATE
---------- ----------- -----------
         3 05.06.2016  05.06.2016
         1 05.06.2016  05.06.2016
         2 05.06.2016  05.06.2016


Т.е. новые записи не добавились, т.е. не отработало.
Пробовал такой изврат:
Код: plsql
1.
2.
3.
4.
5.
begin
  dbms_scheduler.disable(name => 'my_chain', force => true);
  dbms_scheduler.enable(name => 'my_chain');
end;
/


Тоже ничего.
Пробовал удалить цепочку с force => true и создать ее вместе с шагами по-новой:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
begin   
   dbms_scheduler.drop_chain(chain_name => 'my_chain', force => true);
   dbms_scheduler.create_chain (chain_name          => 'my_chain',
                                rule_set_name       => NULL,
                                evaluation_interval => NULL,
                                comments            => 'My first chain');
   dbms_scheduler.define_chain_step (chain_name      =>  'my_chain',
                                     step_name       =>  'step1',
                                     program_name    =>  'job1');
   dbms_scheduler.define_chain_step (chain_name      =>  'my_chain',
                                     step_name       =>  'step2',
                                     program_name    =>  'job2');
   dbms_scheduler.define_chain_step (chain_name      =>  'my_chain',
                                     step_name       =>  'step3',
                                     program_name    =>  'job3');
  dbms_scheduler.enable(name => 'my_chain');
end;


Глухо.
Код: plsql
1.
2.
3.
4.
begin
  dbms_scheduler.run_job(job_name => 'my_chain');
end;
-- ORA-27475: "MY_CHAIN" must be a job 


Ок создаем отдельный джоб для запуска цепочки:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
begin
  dbms_scheduler.create_job(job_name => 'my_chain_job',
                            job_type => 'CHAIN', 
                            job_action => 'my_chain', 
                            enabled => FALSE);
  dbms_scheduler.run_job(job_name => 'my_chain_job');
end;


Тоже тишина.

Итого вопросы:
1. Как повторно запустить цепочку (не по расписанию, а именно вызовом)

2. Обязательно ли для задания значения параметра создавать job-ы?
(почему бы не задать сразу программе, т.е. set_job_anydata_value вижу, а set_program_anydata_value - неа)

3. Не нашел нормальные примеры работы с условиями.
Т.е. надо, чтобы первые два шага цепочки стартовали вместе, а третий шаг, стартовал когда закончатся первые два.
...
Рейтинг: 0 / 0
Using chains
    #39250839
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Avotge,

1. Как повторно запустить цепочку (не по расписанию, а именно вызовом)?

А чем dbms_scheduler.run_chain или dbms_scheduler.run_job не угодил?

2. Обязательно ли для задания значения параметра создавать job-ы?
(почему бы не задать сразу программе, т.е. set_job_anydata_value вижу, а set_program_anydata_value - неа)

А вот это действительно слабое место. Задать параметры на уровне программы невозможно. Можно изголятьcя через drop_program_argument/add_program_argument и задавать очередное значение через default value.

3. Не нашел нормальные примеры работы с условиями. Т.е. надо, чтобы первые два шага цепочки стартовали вместе, а третий шаг, стартовал когда закончатся первые два.

А что до dbms_scheduler.define_chain_rule не дочитал?

Rule 1:

condition => 'TRUE',
action => 'START STEP_1,STEP_2'


Rule 2:

condition => 'STEP_1 SUCCEEDED AND STEP_2 SUCCEEDED',
action => 'START STEP_3'


SY.
...
Рейтинг: 0 / 0
Using chains
    #39250873
Avotge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SYА чем dbms_scheduler.run_chain или dbms_scheduler.run_job не угодил?
Вот и не понял.
run_chain отрабатывает, но при этом процедуры-то не отрабатывают (записи в тестовую таблицу не добавляются).
То же самое с run_job.
...
Рейтинг: 0 / 0
Using chains
    #39250916
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Avotgerun_chain отрабатывает, но при этом процедуры-то не отрабатывают (записи в тестовую таблицу не добавляются).
То же самое с run_job.

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

Код: 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.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
SQL> begin
  2      dbms_scheduler.create_program(
  3                                    program_name        => 'prog1',
  4                                    program_type        => 'STORED_PROCEDURE',
  5                                    program_action      => 'test_proc',
  6                                    number_of_arguments => 1,
  7                                    enabled             => false
  8                                   );
  9      dbms_scheduler.define_program_argument(
 10                                             program_name      => 'prog1',
 11                                             argument_position => 1,
 12                                             argument_name     => 'NM',
 13                                             argument_type     => 'NUMBER',
 14                                             default_value     => 1
 15                                            );
 16      dbms_scheduler.enable('prog1');
 17
 18
 19      dbms_scheduler.create_program(
 20                                    program_name        => 'prog2',
 21                                    program_type        => 'STORED_PROCEDURE',
 22                                    program_action      => 'test_proc',
 23                                    number_of_arguments => 1,
 24                                    enabled             => false
 25                                   );
 26      dbms_scheduler.define_program_argument(
 27                                             program_name      => 'prog2',
 28                                             argument_position => 1,
 29                                             argument_name     => 'NM',
 30                                             argument_type     => 'NUMBER',
 31                                             default_value     => 2
 32                                            );
 33      dbms_scheduler.enable('prog2');
 34
 35
 36      dbms_scheduler.create_program(
 37                                    program_name        => 'prog3',
 38                                    program_type        => 'STORED_PROCEDURE',
 39                                    program_action      => 'test_proc',
 40                                    number_of_arguments => 1,
 41                                    enabled             => false
 42                                   );
 43      dbms_scheduler.define_program_argument(
 44                                             program_name      => 'prog3',
 45                                             argument_position => 1,
 46                                             argument_name     => 'NM',
 47                                             argument_type     => 'NUMBER',
 48                                             default_value     => 3
 49                                            );
 50      dbms_scheduler.enable('prog3');
 51
 52      dbms_scheduler.create_chain(
 53                                  chain_name          => 'my_chain',
 54                                  rule_set_name       => NULL,
 55                                  evaluation_interval => NULL
 56                                 );
 57
 58      dbms_scheduler.define_chain_step(
 59                                       chain_name      =>  'my_chain',
 60                                       step_name       =>  'step1',
 61                                       program_name    =>  'prog1'
 62                                      );
 63
 64      dbms_scheduler.define_chain_step(
 65                                       chain_name      =>  'my_chain',
 66                                       step_name       =>  'step2',
 67                                       program_name    =>  'prog2'
 68                                      );
 69      dbms_scheduler.define_chain_step(
 70                                       chain_name      =>  'my_chain',
 71                                       step_name       =>  'step3',
 72                                       program_name    =>  'prog3'
 73                                      );
 74      dbms_scheduler.enable(
 75                            name => 'my_chain'
 76                           );
 77
 78      dbms_scheduler.define_chain_rule(
 79                                       chain_name => 'my_chain',
 80                                       condition  => 'TRUE',
 81                                       action     => 'START step1,step2',
 82                                       rule_name  => 'chain_rule_1'
 83                                      );
 84      dbms_scheduler.define_chain_rule(
 85                                       chain_name => 'my_chain',
 86                                       condition  => 'STEP1 SUCCEEDED AND STEP2 SUCCEEDED',
 87                                       action     => 'START step3',
 88                                       rule_name  => 'chain_rule_2'
 89                                      );
 90      dbms_scheduler.define_chain_rule(
 91                                       chain_name => 'my_chain',
 92                                       condition  =>  'STEP3 COMPLETED',
 93                                       action     => 'END',
 94                                       rule_name  => 'chain_rule_3'
 95                                      );
 96  end;
 97  /

PL/SQL procedure successfully completed.

SQL>
SQL> begin
  2      dbms_scheduler.run_chain (
  3                                chain_name    => 'my_chain',
  4                                job_name      => 'test_my_chain',
  5                                start_steps   => 'step1,step2'
  6                               );
  7  end;
  8  /

PL/SQL procedure successfully completed.

SQL> SELECT owner,
  2         job_name,
  3         chain_owner,
  4         chain_name,
  5         step_name,
  6         state
  7  FROM   dba_scheduler_running_chains
  8  ORDER BY owner, job_name, chain_name, step_name
  9  /

OWNER      JOB_NAME             CHAIN_OWNE CHAIN_NAME      STEP_NAME       STATE
---------- -------------------- ---------- --------------- --------------- ---------------
SCOTT      TEST_MY_CHAIN        SCOTT      MY_CHAIN        STEP1           NOT_STARTED
SCOTT      TEST_MY_CHAIN        SCOTT      MY_CHAIN        STEP2           NOT_STARTED
SCOTT      TEST_MY_CHAIN        SCOTT      MY_CHAIN        STEP3           NOT_STARTED

SQL> /

OWNER      JOB_NAME             CHAIN_OWNE CHAIN_NAME      STEP_NAME       STATE
---------- -------------------- ---------- --------------- --------------- ---------------
SCOTT      TEST_MY_CHAIN        SCOTT      MY_CHAIN        STEP1           RUNNING
SCOTT      TEST_MY_CHAIN        SCOTT      MY_CHAIN        STEP2           RUNNING
SCOTT      TEST_MY_CHAIN        SCOTT      MY_CHAIN        STEP3           NOT_STARTED

SQL> /

OWNER      JOB_NAME             CHAIN_OWNE CHAIN_NAME      STEP_NAME       STATE
---------- -------------------- ---------- --------------- --------------- ---------------
SCOTT      TEST_MY_CHAIN        SCOTT      MY_CHAIN        STEP1           SUCCEEDED
SCOTT      TEST_MY_CHAIN        SCOTT      MY_CHAIN        STEP2           SUCCEEDED
SCOTT      TEST_MY_CHAIN        SCOTT      MY_CHAIN        STEP3           RUNNING

SQL> /

no rows selected

SQL> select  *
  2    from  tes
  3    order by id
  4  /

        ID BEG_DATE            END_DATE
---------- ------------------- -------------------
         1 06/05/2016 13:46:43 06/05/2016 13:47:43
         2 06/05/2016 13:46:43 06/05/2016 13:47:43
         3 06/05/2016 13:47:44 06/05/2016 13:48:44

SQL>



А теперь менем значения пaраметров через изменение значений по умолчанию:

Код: 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.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
SQL> begin
  2      dbms_scheduler.drop_program_argument(
  3                                           program_name      => 'prog1',
  4                                           argument_position => 1
  5                                          );
  6      dbms_scheduler.define_program_argument(
  7                                             program_name      => 'prog1',
  8                                             argument_position => 1,
  9                                             argument_name     => 'NM',
 10                                             argument_type     => 'NUMBER',
 11                                             default_value     => 25
 12                                            );
 13      dbms_scheduler.enable('prog1');
 14      dbms_scheduler.drop_program_argument(
 15                                           program_name      => 'prog2',
 16                                           argument_position => 1
 17                                          );
 18      dbms_scheduler.define_program_argument(
 19                                             program_name      => 'prog2',
 20                                             argument_position => 1,
 21                                             argument_name     => 'NM',
 22                                             argument_type     => 'NUMBER',
 23                                             default_value     => 50
 24                                            );
 25      dbms_scheduler.enable('prog2');
 26      dbms_scheduler.drop_program_argument(
 27                                           program_name      => 'prog3',
 28                                           argument_position => 1
 29                                          );
 30      dbms_scheduler.define_program_argument(
 31                                             program_name      => 'prog3',
 32                                             argument_position => 1,
 33                                             argument_name     => 'NM',
 34                                             argument_type     => 'NUMBER',
 35                                             default_value     => 75
 36                                            );
 37      dbms_scheduler.enable('prog3');
 38  end;
 39  /

PL/SQL procedure successfully completed.

SQL> begin
  2      dbms_scheduler.run_chain (
  3                                chain_name    => 'my_chain',
  4                                job_name      => 'test_my_chain',
  5                                start_steps   => 'step1,step2'
  6                               );
  7  end;
  8  /

PL/SQL procedure successfully completed.

SQL> SELECT owner,
  2         job_name,
  3         chain_owner,
  4         chain_name,
  5         step_name,
  6         state
  7  FROM   dba_scheduler_running_chains
  8  ORDER BY owner, job_name, chain_name, step_name
  9  /

OWNER      JOB_NAME             CHAIN_OWNE CHAIN_NAME      STEP_NAME       STATE
---------- -------------------- ---------- --------------- --------------- ---------------
SCOTT      TEST_MY_CHAIN        SCOTT      MY_CHAIN        STEP1           NOT_STARTED
SCOTT      TEST_MY_CHAIN        SCOTT      MY_CHAIN        STEP2           NOT_STARTED
SCOTT      TEST_MY_CHAIN        SCOTT      MY_CHAIN        STEP3           NOT_STARTED

SQL> /

OWNER      JOB_NAME             CHAIN_OWNE CHAIN_NAME      STEP_NAME       STATE
---------- -------------------- ---------- --------------- --------------- ---------------
SCOTT      TEST_MY_CHAIN        SCOTT      MY_CHAIN        STEP1           RUNNING
SCOTT      TEST_MY_CHAIN        SCOTT      MY_CHAIN        STEP2           RUNNING
SCOTT      TEST_MY_CHAIN        SCOTT      MY_CHAIN        STEP3           NOT_STARTED

SQL> /

OWNER      JOB_NAME             CHAIN_OWNE CHAIN_NAME      STEP_NAME       STATE
---------- -------------------- ---------- --------------- --------------- ---------------
SCOTT      TEST_MY_CHAIN        SCOTT      MY_CHAIN        STEP1           SUCCEEDED
SCOTT      TEST_MY_CHAIN        SCOTT      MY_CHAIN        STEP2           SUCCEEDED
SCOTT      TEST_MY_CHAIN        SCOTT      MY_CHAIN        STEP3           RUNNING

SQL> /

no rows selected

SQL> select  *
  2    from  tes
  3    order by id
  4  /

        ID BEG_DATE            END_DATE
---------- ------------------- -------------------
         1 06/05/2016 13:46:43 06/05/2016 13:47:43
         2 06/05/2016 13:46:43 06/05/2016 13:47:43
         3 06/05/2016 13:47:44 06/05/2016 13:48:44
        25 06/05/2016 13:49:14 06/05/2016 13:50:14
        50 06/05/2016 13:49:14 06/05/2016 13:50:14
        75 06/05/2016 13:50:18 06/05/2016 13:51:18

6 rows selected.

SQL>



SY.
...
Рейтинг: 0 / 0
Using chains
    #39250922
Avotge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY , спасибо большое, отлично работет. Джобы выбросил )
Ну и возможно, критично создавать правила на start и end цепочки.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Using chains
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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