powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Откатить транзакцию в функции при возникновении ошибки или если что не устроило в процессе
3 сообщений из 3, страница 1 из 1
Откатить транзакцию в функции при возникновении ошибки или если что не устроило в процессе
    #39403840
Добрый день.

Подскажите, как в функции реализовать обработку ошибок, с откатом транзакции.

Код: 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.
CREATE OR REPLACE FUNCTION ap_authorization_beginning2(p_phone VARCHAR(50)) 
RETURNS table(p_result int2, p_error varchar(50), p_key varchar(50), p_value varchar(50)) AS
$$
DECLARE r_p_result 	int2;
DECLARE r_p_error 	varchar(50);
DECLARE num4 			varchar(4);
DECLARE guid_id 	int8;
BEGIN
		r_p_result	:= 0;
		r_p_error	:= 'error';	

		                /*начинаем транзакцию*/
				START TRANSACTION;

				BEGIN
                                        /*что то происходит, что может вызвать ошибку (insert|delete|update)*/
					r_p_result	:= 1;
					r_p_error	:= '';
				EXCEPTION 
					WHEN OTHERS  THEN 
						BEGIN
							r_p_result	        := 0;  /*если ошибка то присвоим значение 0*/
							r_p_error		:= '';
						END;
				END;

                        /*если значение 0 то откатим транзакцию*/
			IF (r_p_result = 0) THEN
					ROLLBACK TRANSACTION;
			ELSE
					COMMIT TRANSACTION;
			END IF;

        p_result 	:= 	r_p_result;
        p_error 	:= 	r_p_error;
	p_key	:= 	'guid';
	p_value	:=	CAST(guid_id as VARCHAR(50));
  RETURN NEXT;
END
$$ LANGUAGE plpgsql;



получаю ошибку при вызове функции:

Procedure execution failed
ERROR: cannot begin/end transactions in PL/pgSQL
HINT: Use a BEGIN block with an EXCEPTION clause instead.
CONTEXT: PL/pgSQL function ap_authorization_beginning2(character varying) line 11 at SQL statement
...
Рейтинг: 0 / 0
Откатить транзакцию в функции при возникновении ошибки или если что не устроило в процессе
    #39403843
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Боровиков Степан,

исключение и так откатит весь обрамляющий блок.
...
Рейтинг: 0 / 0
Откатить транзакцию в функции при возникновении ошибки или если что не устроило в процессе
    #39403926
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Боровиков СтепанДобрый день.

Подскажите, как в функции реализовать обработку ошибок, с откатом транзакции.

Код: 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.
CREATE OR REPLACE FUNCTION ap_authorization_beginning2(p_phone VARCHAR(50)) 
RETURNS table(p_result int2, p_error varchar(50), p_key varchar(50), p_value varchar(50)) AS
$$
DECLARE r_p_result 	int2;
DECLARE r_p_error 	varchar(50);
DECLARE num4 			varchar(4);
DECLARE guid_id 	int8;
BEGIN
		r_p_result	:= 0;
		r_p_error	:= 'error';	

		                /*начинаем транзакцию*/  --WTF ?
		                -- в ф-ии нельзя стартовать транзу, ибо вся ф--я уже в транзе
		                -- а вложенных не бывает
				--START TRANSACTION;
				-- но можно стартовать автономию через дблинк
				-- result = dblink_connect('my_conn','.............'); -- RTFM extension dblink
	                	-- result =dblink_exec('my_conn', 'START TRANSACTION;');

				BEGIN -- это сейвпойнт (т.к. содержит exception кляузу)
                                        /*что то происходит, что может вызвать ошибку (insert|delete|update)*/
					r_p_result	:= 1;
					r_p_error	:= '';
				EXCEPTION -- это, как минимум, роллбек к рпедыдущему по вложенности бегину)
					WHEN OTHERS  THEN 
		                	-- DO NOTHING -- поскольку перехватили, вся ф-я не упадет, а будет откат по "бегин"
				END;

                        
					--ROLLBACK TRANSACTION; -- это в ф-ии низзя
					--но можно управлять автономией:
		                	--result = dblink_exec('my_conn', 'ROLLBACK TRANSACTION;')

					--COMMIT TRANSACTION;
					-- и т.д.


        p_result 	:= 	r_p_result;
        p_error 	:= 	r_p_error;
	p_key	:= 	'guid';
	p_value	:=	CAST(guid_id as VARCHAR(50));
  RETURN NEXT;
END
$$ LANGUAGE plpgsql;



получаю ошибку при вызове функции:

Procedure execution failed
ERROR: cannot begin/end transactions in PL/pgSQL
HINT: Use a BEGIN block with an EXCEPTION clause instead.
CONTEXT: PL/pgSQL function ap_authorization_beginning2(character varying) line 11 at SQL statement

-- вам и пишут, что sql команды старта окончания транз в ф--ях недопустимы.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Откатить транзакцию в функции при возникновении ошибки или если что не устроило в процессе
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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