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

Concepts
...
Рейтинг: 0 / 0
Вызов двух процедур в одной транзакции.
    #39762331
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex2019Как это провернуть.Это задача для послеясельной группы детсада. Т.е. сперва надо отмотать срок в яслях.
...
Рейтинг: 0 / 0
Вызов двух процедур в одной транзакции.
    #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
Вызов двух процедур в одной транзакции.
    #39762348
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроик Семён
Код: plsql
1.
  PRAGMA AUTONOMOUS_TRANSACTION;

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

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


Зачем?

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

Именно так и проворачивай: стартуй транзакцию, вызывай процедуры, в конце коммит. В чём
проблема-то?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вызов двух процедур в одной транзакции.
    #39762360
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex2019Вызываем сначала процедуру А() и если она отработала успешно вызвать процедуру В() и если она отработало тоже нормальноRTFM Statement-Level Atomicity (FAQ)
...
Рейтинг: 0 / 0
Вызов двух процедур в одной транзакции.
    #39762363
Alex2019
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,
Нужно вызвать А() она вернет код ошибки, если он ОК, то вызвать В() и если код тоже ОК то совершить транзакцию. Если любая из них
выдала код НЕ_ОК, то отка.
...
Рейтинг: 0 / 0
Вызов двух процедур в одной транзакции.
    #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
Вызов двух процедур в одной транзакции.
    #39762369
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovAlex2019Нужно вызвать А() она вернет Ну так в чём проблема-то?Alex2019процедуру А()
...
Рейтинг: 0 / 0
Вызов двух процедур в одной транзакции.
    #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
Вызов двух процедур в одной транзакции.
    #39762380
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex2019Я так понял.?

Нет, это бред. Вернись на курсы для начинающих программистов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вызов двух процедур в одной транзакции.
    #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
Вызов двух процедур в одной транзакции.
    #39762412
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

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

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

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

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

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

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

WHEN OTHERS THEN NULL

Автор, я бы уточнил бы критерий " успешного завершения обоих".
...
Рейтинг: 0 / 0
Вызов двух процедур в одной транзакции.
    #39762468
Alex2019
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AserYZ,

A(errCode);
если код ошибки 0, то продолжаем
В(errCode) если и здесь все ок errCode = 0, то коммит и вернуть errCode.
**************
A(errCode);
если код ошибки -1, rollback, и вернуть код ошибки. т.е. -1)
В() не вызываем.
************************
A(errCode);
если код ошибки 0, то продолжаем
В(errCode) если errCode = -1, то rollback, и вернуть код ошибки. т.е. -1.
...
Рейтинг: 0 / 0
Вызов двух процедур в одной транзакции.
    #39762470
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AserYZЭто если где-то в A() какой-то умник не поставил.
WHEN OTHERS THEN NULL
Пусть процедура содержит секцию обработки исключительных ситуаций и завершается без exception.
Это означает, что процедура завершилась УСПЕШНО, что бы это ни значило.
Если при этом результат выполнения процедуры не соответствует ТЗ, то такая проблема решается багрепортом с последующим багфиксом указанной процедуры.
Не дело вызывающего кода контролировать корректность вызываемых методов.
...
Рейтинг: 0 / 0
Вызов двух процедур в одной транзакции.
    #39762473
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex2019если код ошибки -1, rollback
Сразу два недочета.
- интерфейс, основанный на анализе кода ошибок, ведет к многословному и плохо читаемому, замусоренному однотипными конструкциями коду.
- выполнять rollback или commit внутри процедуры - моветон. Препятствует переиспользованию кода и снижает сопровождаемость. Как сделать rollback правильно - я показал.
...
Рейтинг: 0 / 0
Вызов двух процедур в одной транзакции.
    #39762513
AserYZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousПусть процедура содержит секцию обработки исключительных ситуаций и завершается без exception.
Это означает, что процедура завершилась УСПЕШНО, что бы это ни значило.


У автора, как оказалось, другое мнение, он расчитывает на RC. Отчасти такая реализация тоже имеет место. Наример, комбинация входных параметров A() неправильная. Причем RC=-1 и RC=-2 могут означать две различных ситуации с последующей реакцией в вызывающем коде. Оракл не стесняется использовать RC :)

Задача была простая - вызвать 2 процедуры последовательно в одной транзакции с анализом RC.

Для начала я бы их переделал в функции, раз уж RC, либо параметры INOUT прописал бы с последующим анализом в вызывающем коде.

С чем безоговорочно согласен, так это с тем, что коммитить/ролбечить транзакции нужно на уровне бизнес логики (в общем случае) а не на уровне БД.
...
Рейтинг: 0 / 0
Вызов двух процедур в одной транзакции.
    #39762522
Alex2019
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AserYZ, Да вы правы, но увы есть пакет, в нем 2 процедуры, и ТЗ в одной транзакции выполнить их, и после успешного завершения обоих выполнить коммит.
...
Рейтинг: 0 / 0
Вызов двух процедур в одной транзакции.
    #39762524
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex2019ТЗ в одной транзакции выполнить их, и после успешного завершения обоих выполнить коммит.

Так это тебе не сюда, а в раздел, посвящённый языку программирования в курсе которого эта
лабораторная. Ибо управление транзакциями идёт из клиентского приложения.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вызов двух процедур в одной транзакции.
    #39762525
Alex2019
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Выполнить именно на PL SQL.
...
Рейтинг: 0 / 0
Вызов двух процедур в одной транзакции.
    #39762528
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex2019Выполнить именно на PL SQL.

Тогда читай PL/SQL User Guide and Reference начиная с "COMMIT Statement".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вызов двух процедур в одной транзакции.
    #39762539
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроик Семён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
Вызов двух процедур в одной транзакции.
    #39762567
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроик СемёнКроик Семён[src plsql]
PRAGMA AUTONOMOUS_TRANSACTION;

я же утром еще запостил
Семен, заканчивайте уже плостить ерунду по утрам :)
...
Рейтинг: 0 / 0
Вызов двух процедур в одной транзакции.
    #39762622
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousСемен, заканчивайте уже плостить ерунду по утрам :)Ручник, он и в африке ручник :|
...
Рейтинг: 0 / 0
Вызов двух процедур в одной транзакции.
    #39762710
DKbru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous
Код: plsql
1.
  if initcap(i_param) like 'Explode' 


Без использования групповых символов или escape like тут явно неуместный оператор, разве нет?
...
Рейтинг: 0 / 0
Вызов двух процедур в одной транзакции.
    #39762933
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DKbrulike тут явно неуместный оператор, разве нет?
По мне так это "явно неуместное замечание".
...
Рейтинг: 0 / 0
Вызов двух процедур в одной транзакции.
    #39762976
DKbru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,
В таком случае, прошу Вас меня искренне извинить, просто Ваши посты читаю, как мантру и стараюсь почерпнуть для себя что-то новое. А иногда в жизни даже на самые простые вещи бывает порой самое неожиданное объяснение. Поэтому я решил уточнить, может тут есть скрытый смысл, который мне, в силу ограниченного мышления, постичь не дано.
...
Рейтинг: 0 / 0
Вызов двух процедур в одной транзакции.
    #39762992
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DKbruнеожиданное объяснениеЕсли сравниваешь строковое и числовое поле на равенство, like написать короче, чем to_char()=.
...
Рейтинг: 0 / 0
Вызов двух процедур в одной транзакции.
    #39762998
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DKbruпосты читаю, как мантру
Вот это зря.
Не сотвори себе кумира (с)

DKbru и стараюсь почерпнуть для себя что-то новое.

Применительно к вопросу -
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SQL> explain plan for select dummy from dual where dummy like 'X';
Explained

SQL> select * from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 4017058736
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |     2 |     2   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("DUMMY"='X')
13 rows selected

SQL> 



Применительно к неуместности замечания - в данной ветке это вопрос, не имеющий отношения к обсуждаемой проблеме, или оффтопик.
И не просто оффтопик, а попытка увести обсуждение в дальние дали.

...вот как-то так.
...
Рейтинг: 0 / 0
Вызов двух процедур в одной транзакции.
    #39763043
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    LIKE

        Оптимизатор  упрощает  условия,  содержащие  оператор  сравнения
        LIKE, в эквивалентное  условие, использующее оператор  равенства
        (если это возможно).   Например, оптимизатор заменяет  первое из
        двух следующих условий на второе:

        ename LIKE 'SMITH'

        ename = 'SMITH'


интересно на что он еще может заменить?
напр a like '123%' substr(a,1,3)='123'?

.....
stax
...
Рейтинг: 0 / 0
Вызов двух процедур в одной транзакции.
    #39763046
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxинтересно на что он еще может заменить?
напр a like '123%' substr(a,1,3)='123'?

.....
stax
Это как раз врядли потому как по like умеет index range scan а по substr не умеет (на обычном b-tree)

Regards

Maxim
...
Рейтинг: 0 / 0
Вызов двух процедур в одной транзакции.
    #39763047
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim DemenkoStaxинтересно на что он еще может заменить?
напр a like '123%' substr(a,1,3)='123'?

.....
stax
Это как раз врядли потому как по like умеет index range scan а по substr не умеет (на обычном b-tree)

Regards

Maxim
я ето (like умеет index range scan) знаю, и поетому активно пользовался substr

уточним - поле неиндексировано

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


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