Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вызов двух процедур в одной транзакции. / 25 сообщений из 44, страница 1 из 2
21.01.2019, 13:09
    #39762322
Alex2019
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов двух процедур в одной транзакции.
Добрый день. Есть вопрос. Мне нужно вызвать две процедуры в одной транзакции. Вызываем сначала процедуру А() и если она отработала успешно вызвать процедуру В() и если она отработало тоже нормально выполнить коммит, а если нет то вернуть ошибку.
В общем нужно вызвать А() затем В() и после успешного завершения обоих выполнить COMMIT. Как это провернуть.
...
Рейтинг: 0 / 0
21.01.2019, 13:15
    #39762326
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов двух процедур в одной транзакции.
Alex2019,

Concepts
...
Рейтинг: 0 / 0
21.01.2019, 13:20
    #39762331
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов двух процедур в одной транзакции.
Alex2019Как это провернуть.Это задача для послеясельной группы детсада. Т.е. сперва надо отмотать срок в яслях.
...
Рейтинг: 0 / 0
21.01.2019, 13:43
    #39762347
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов двух процедур в одной транзакции.
Alex2019,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
DECLARE
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  A; -- до "B;", а уж тем более до "COMMIT;" не дойдет, если "A;" выбросит EXCEPTION
  B;

  COMMIT;
END;
...
Рейтинг: 0 / 0
21.01.2019, 13:44
    #39762348
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов двух процедур в одной транзакции.
Кроик Семён
Код: plsql
1.
  PRAGMA AUTONOMOUS_TRANSACTION;

Зачем?
...
Рейтинг: 0 / 0
21.01.2019, 13:44
    #39762349
Alex2019
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов двух процедур в одной транзакции.
Да я понимая что легко. Но первый раз с этим вообще работаю. Хот пример какой-то может кто-то даст.
...
Рейтинг: 0 / 0
21.01.2019, 13:46
    #39762352
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов двух процедур в одной транзакции.
Alex2019пример какой-то может кто-то даст.RTFM Subprogram Invocations (FAQ)
...
Рейтинг: 0 / 0
21.01.2019, 13:48
    #39762354
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов двух процедур в одной транзакции.
Elic,

ElicКроик Семён
Код: plsql
1.
  PRAGMA AUTONOMOUS_TRANSACTION;


Зачем?

Помедитировал над вопросом и подумал, что автору нужно закоммитить A и B и только это, не влияя на вызывающую сессию
...
Рейтинг: 0 / 0
21.01.2019, 13:50
    #39762356
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов двух процедур в одной транзакции.
Кроик Семённе влияя на вызывающую сессиюИзмышлизмЪ.
...
Рейтинг: 0 / 0
21.01.2019, 13:50
    #39762357
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов двух процедур в одной транзакции.
Alex2019Мне нужно вызвать две процедуры в одной транзакции. Вызываем сначала процедуру А() и если
она отработала успешно вызвать процедуру В() и если она отработало тоже нормально
выполнить коммит, а если нет то вернуть ошибку.
В общем нужно вызвать А() затем В() и после успешного завершения обоих выполнить COMMIT.
Как это провернуть.

Именно так и проворачивай: стартуй транзакцию, вызывай процедуры, в конце коммит. В чём
проблема-то?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
21.01.2019, 13:51
    #39762360
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов двух процедур в одной транзакции.
Alex2019Вызываем сначала процедуру А() и если она отработала успешно вызвать процедуру В() и если она отработало тоже нормальноRTFM Statement-Level Atomicity (FAQ)
...
Рейтинг: 0 / 0
21.01.2019, 13:52
    #39762363
Alex2019
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов двух процедур в одной транзакции.
Dimitry Sibiryakov,
Нужно вызвать А() она вернет код ошибки, если он ОК, то вызвать В() и если код тоже ОК то совершить транзакцию. Если любая из них
выдала код НЕ_ОК, то отка.
...
Рейтинг: 0 / 0
21.01.2019, 13:58
    #39762367
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов двух процедур в одной транзакции.
Alex2019Нужно вызвать А() она вернет код ошибки, если он ОК, то вызвать В() и если код тоже ОК то
совершить транзакцию. Если любая из них
выдала код НЕ_ОК, то отка.

Ну так в чём проблема-то?
Код: plaintext
1.
if (A() == HE_OK || B() == HE_OK) rollback(); else commit();


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
21.01.2019, 14:01
    #39762369
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов двух процедур в одной транзакции.
Dimitry SibiryakovAlex2019Нужно вызвать А() она вернет Ну так в чём проблема-то?Alex2019процедуру А()
...
Рейтинг: 0 / 0
21.01.2019, 14:01
    #39762371
Alex2019
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов двух процедур в одной транзакции.
Dimitry Sibiryakov, Т.е. Я так понял.?
DECLARE
error number;
BEGIN
A(error);
if error <> 0 then rollback;
B(error);
if error <> 0 then rollback;
COMMIT;
END;
...
Рейтинг: 0 / 0
21.01.2019, 14:31
    #39762380
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов двух процедур в одной транзакции.
Alex2019Я так понял.?

Нет, это бред. Вернись на курсы для начинающих программистов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
21.01.2019, 14:34
    #39762383
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов двух процедур в одной транзакции.
Код: 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.
create table dropme_t(id number, action varchar2(50));
Table created
insert into dropme_t values(1,'Initial');
1 row inserted

commit;
Commit complete

create or replace procedure dropme_a(i_param varchar2 default null) as
begin
  insert into dropme_t values(2,'Inserted by a()');
  if initcap(i_param) like 'Explode' then raise invalid_number; end if;
  update dropme_t set action = action||' Updated by a()';
end;
/
Procedure created
sho err

No errors for PROCEDURE DEVELOPER.DROPME_A
create or replace procedure dropme_b(i_param varchar2 default null) as
begin
  insert into dropme_t values(3,'Inserted by b()');
  update dropme_t set action = action||' Updated by b()' where mod(id,2)=1;
end;
/
Procedure created
sho err
No errors for PROCEDURE DEVELOPER.DROPME_B

select * from dropme_t;
        ID ACTION
---------- --------------------------------------------------
         1 Initial

-- Successive run
begin
  insert into dropme_t values(4,'Inserted by Caller');
  dropme_a();
  dropme_b();
end;
/
PL/SQL procedure successfully completed

select * from dropme_t order by id;
        ID ACTION
---------- --------------------------------------------------
         1 Initial Updated by a() Updated by b()
         2 Inserted by a() Updated by a()
         3 Inserted by b() Updated by b()
         4 Inserted by Caller Updated by a()

rollback;
Rollback complete

select * from dropme_t;
        ID ACTION
---------- --------------------------------------------------
         1 Initial

-- Inconsistent exception handling
begin
  insert into dropme_t values(4,'Inserted by Caller');
--  savepoint s1;
  dropme_a('explode');
  dropme_b();
exception
  when invalid_number then null;
--  when invalid_number then rollback to savepoint s1;
end;
/
PL/SQL procedure successfully completed

select * from dropme_t order by id;
        ID ACTION
---------- --------------------------------------------------
         1 Initial
         2 Inserted by a()
         4 Inserted by Caller

rollback;
Rollback complete

select * from dropme_t;
        ID ACTION
---------- --------------------------------------------------
         1 Initial

-- Correct run
begin
  insert into dropme_t values(4,'Inserted by Caller');
  savepoint s1;
  dropme_a('explode');
  dropme_b();
exception
  when invalid_number then rollback to savepoint s1;
end;
/
PL/SQL procedure successfully completed

select * from dropme_t order by id;
        ID ACTION
---------- --------------------------------------------------
         1 Initial
         4 Inserted by Caller

SQL> 
...
Рейтинг: 0 / 0
21.01.2019, 15:14
    #39762412
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов двух процедур в одной транзакции.
andrey_anonymous,

В коня ли корм?
...
Рейтинг: 0 / 0
21.01.2019, 15:38
    #39762419
rf_mail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов двух процедур в одной транзакции.
Alex2019Добрый день. Есть вопрос. Мне нужно вызвать две процедуры в одной транзакции. Вызываем сначала процедуру А() и если она отработала успешно вызвать процедуру В() и если она отработало тоже нормально выполнить коммит, а если нет то вернуть ошибку.
В общем нужно вызвать А() затем В() и после успешного завершения обоих выполнить COMMIT. Как это провернуть.

Вы хотите сказать, что код PL/SQL, по-умолчанию, работает синхронно?
...
Рейтинг: 0 / 0
21.01.2019, 16:03
    #39762430
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов двух процедур в одной транзакции.
rf_mailВы хотите сказать, что код PL/SQL, по-умолчанию, работает синхронно?Формулировка недоумевает варианты ответа: синхронно, асинхронно. Причем это переключается неким по-умолчанием.
...
Рейтинг: 0 / 0
21.01.2019, 16:12
    #39762435
rf_mail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов двух процедур в одной транзакции.
-2-rf_mailВы хотите сказать, что код PL/SQL, по-умолчанию, работает синхронно?Формулировка недоумевает варианты ответа: синхронно, асинхронно. Причем это переключается неким по-умолчанием.
на этот вопрос советую ответ

begin
А();
В();
COMMIT;
end;
...
Рейтинг: 0 / 0
21.01.2019, 16:17
    #39762438
Alex2019
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов двух процедур в одной транзакции.
rf_mail,

PS SQL работаю пару дней, так что на такие вопросы я ответить не могу.
...
Рейтинг: 0 / 0
21.01.2019, 16:36
    #39762449
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов двух процедур в одной транзакции.
Alex2019SQL работаю пару днейЗаходи через пару лет. Может за 100 понедельников что-нибудь, да освоишь.
...
Рейтинг: 0 / 0
21.01.2019, 16:41
    #39762452
Alex2019
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов двух процедур в одной транзакции.
-2-Alex2019SQL работаю пару днейЗаходи через пару лет. Может за 100 понедельников что-нибудь, да освоишь.
Ок. Постараюсь освоить.
...
Рейтинг: 0 / 0
21.01.2019, 16:44
    #39762454
AserYZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов двух процедур в одной транзакции.
rf_mail-2-пропущено...
Формулировка недоумевает варианты ответа: синхронно, асинхронно. Причем это переключается неким по-умолчанием.
на этот вопрос советую ответ

begin
А();
В();
COMMIT;
end;

Это если где-то в A() какой-то умник не поставил.

WHEN OTHERS THEN NULL

Автор, я бы уточнил бы критерий " успешного завершения обоих".
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вызов двух процедур в одной транзакции. / 25 сообщений из 44, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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