Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Функции и транзакции / 25 сообщений из 39, страница 1 из 2
07.08.2016, 18:10
    #39287939
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции и транзакции
Можно ли определить находясь в функции - была ли она вызвана в транзакции?
Возможно, у меня неправильный подход, но вот пример, навеянный подходом в SQL Server

Функция1
----------
...
если вызвана НЕ в открытой транзакции -
{
begin transaction;
}

..
вызов Функции2();
если была ошибка
{
если транзакция открыта в этой функции rollback;
return;
}
...
commit;
--------------end


Функция2
----------
...
если вызвана НЕ в открытой транзакции -
{
begin transaction;
}

..
...
если транзакция окрыта в этой функции
{
commit or rollback;
}
вернуть код или exception;
-------------- end


Какая практика в PostgreSQL?
...
Рейтинг: 0 / 0
07.08.2016, 18:23
    #39287942
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции и транзакции
Ролг Хупин,

в postgresql хранимки выполняются всегда в транзакции.
...
Рейтинг: 0 / 0
07.08.2016, 18:44
    #39287950
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции и транзакции
MelkijРолг Хупин,

в postgresql хранимки выполняются всегда в транзакции.


Да, нашел, что в функциях нельзя открывать/закрывать транзакции.

Правильно ли я понимаю:

Код: sql
1.
select myfunc(1); -- выполняется в автоматически создаваемой транзакции?



что надо сделать внутри функции, если посреди выполнения что-то возникло, чтобы откатить эту транзакцию до начала функции?
...
Рейтинг: 0 / 0
07.08.2016, 19:04
    #39287953
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции и транзакции
Ролг ХупинMelkijРолг Хупин,

в postgresql хранимки выполняются всегда в транзакции.


Да, нашел, что в функциях нельзя открывать/закрывать транзакции.

Правильно ли я понимаю:

Код: sql
1.
select myfunc(1); -- выполняется в автоматически создаваемой транзакции?



что надо сделать внутри функции, если посреди выполнения что-то возникло, чтобы откатить эту транзакцию до начала функции?

savepoint в доке postgresql.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
07.08.2016, 19:13
    #39287955
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции и транзакции
То есть, вот такой запрос практически не имеет смысла, поскольку по факту - одна транзакция (в функции)?

Код: sql
1.
2.
3.
begin transaction;
select myfunc(1);
commit;
...
Рейтинг: 0 / 0
07.08.2016, 19:17
    #39287957
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции и транзакции
Maxim BogukРолг Хупинпропущено...



Да, нашел, что в функциях нельзя открывать/закрывать транзакции.

Правильно ли я понимаю:

Код: sql
1.
select myfunc(1); -- выполняется в автоматически создаваемой транзакции?



что надо сделать внутри функции, если посреди выполнения что-то возникло, чтобы откатить эту транзакцию до начала функции?

savepoint в доке postgresql.

--
Maxim Boguk
www.postgresql-consulting.ru

я имел в виду немного другое наверное

функция выполняется всегда в своей транзакции, и если все ок, то будет выполнен неявный коммит.
Как надо завершить или что надо сделать в функции, чтобы она завершилась своим неявным роллбэком?
...
Рейтинг: 0 / 0
07.08.2016, 19:29
    #39287961
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции и транзакции
Ролг ХупинMaxim Bogukпропущено...


savepoint в доке postgresql.

--
Maxim Boguk
www.postgresql-consulting.ru

я имел в виду немного другое наверное

функция выполняется всегда в своей транзакции, и если все ок, то будет выполнен неявный коммит.
Как надо завершить или что надо сделать в функции, чтобы она завершилась своим неявным роллбэком?

RAISE EXCEPTION сделать.

Или вызывать в явной транзакции и по результатам делать commit или rollback.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
07.08.2016, 20:39
    #39287971
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции и транзакции
Maxim BogukРолг Хупинпропущено...


я имел в виду немного другое наверное

функция выполняется всегда в своей транзакции, и если все ок, то будет выполнен неявный коммит.
Как надо завершить или что надо сделать в функции, чтобы она завершилась своим неявным роллбэком?

RAISE EXCEPTION сделать.

Или вызывать в явной транзакции и по результатам делать commit или rollback.

--
Maxim Boguk
www.postgresql-consulting.ru

ясно, спасибо. еще:

если функция1 вызывает функцию2, а та - функцию3, значит ли это, что будут три вложенные
транзакции?
и что будет в случае, если функция3 завершится нормально (неявный коммит),
а вот функция2 сгенерирует RAISE EXCEPTION ?
...
Рейтинг: 0 / 0
07.08.2016, 21:30
    #39287985
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции и транзакции
Ролг Хупин,

Будет 1 транзакция, вне зависимости от вложения ф-ий — та, в рамках которой была вызвана самая первая ф-ия.

Завершение функции к коммиту (неважно какому) не приводит, т.к. функция выполняется в рамках транзакции запроса, который её вызвал. (Потому и функции, в отличии от О! процедур.)

Если функция кидает исключение и его никто не ловит, то запрос считается ошибочным и транзакция откатывается либо целиком, либо до точки (если она была).
...
Рейтинг: 0 / 0
08.08.2016, 08:57
    #39288065
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции и транзакции
Ролг Хупин,

поцгрес как и аракел не придерживается абсракции "вложенных транзакций"
вместо них используется эквивалентная концепция "сейвпойнтов"
которые могут быть как "явными" -- sql--savepoint так и неявными -- plpgslq: begin [savepoint here] ... exception when ... end;


факультативноэ: на любом сейвпойнте в пж наваривается счётчик транзакций (на т.н. сабтранзакциях).
...
Рейтинг: 0 / 0
08.08.2016, 09:11
    #39288075
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции и транзакции
vyegorovРолг Хупин,

Будет 1 транзакция, вне зависимости от вложения ф-ий — та, в рамках которой была вызвана самая первая ф-ия.

Завершение функции к коммиту (неважно какому) не приводит, т.к. функция выполняется в рамках транзакции запроса, который её вызвал. (Потому и функции, в отличии от О! процедур.)

Если функция кидает исключение и его никто не ловит, то запрос считается ошибочным и транзакция откатывается либо целиком, либо до точки (если она была).

То есть, если я правильно понял:

я в приложении делаю запрос

Код: sql
1.
select fun1();



fun1() вызывает fun2(), которая вызывает fun3()

fun3 успевает что-то сделать, а fun2 генерирует исключение
(явно или нет, не важно),
результат - роллбэк всего запроса select fun1();
включая роллбэк действий, уже сделанных fun3()

так?
...
Рейтинг: 0 / 0
08.08.2016, 11:15
    #39288150
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции и транзакции
Здесь нашел небольшое обсуждение, интересны два последних примера, точнеее - второй
Что получается: есть явная транзакция, затем функция выолняется в своей неявной транзакции или же делает неявный
begin savepoint?


http://postgresql.ru.net/node/214388

Получается, что функция как бы транзакция в транзакции, и не очень-то это хорошо, хотя бы потому что это неочевидно!
Хотя что называется, почувствуйте разницу:
1. Берём вариант функции БЕЗ обработки исключения:
CREATE OR REPLACE FUNCTION "public"."fntrans" (
)
RETURNS integer AS
$body$
declare d double precision;
BEGIN
INSERT INTO t2 (f1) VALUES (1);
INSERT INTO t2 (f1) VALUES (2);
INSERT INTO t2 (f1) VALUES (3);
raise exception 'Oooooppsss!';
INSERT INTO t2 (f1) VALUES (4);
RETURN 1;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;
$tmp=# BEGIN;
BEGIN
tmp=# INSERT INTO t2 (f1) VALUES (5);
INSERT 0 1
tmp=# SELECT fntrans();
ERROR: Oooooppsss!
tmp=# COMMIT;
ROLLBACK
tmp=# select * from t2;
f1
----
(0 rows)
Т.е. после COMMIT, выполнился ROLLBACK и INSERT который был вызван внутри транзакции перед функцией не выполнился.

2. Берём вариант функции C обработкой исключения:
CREATE OR REPLACE FUNCTION "public"."fntrans" (
)
RETURNS integer AS
$body$
declare d double precision;
BEGIN
INSERT INTO t2 (f1) VALUES (1);
INSERT INTO t2 (f1) VALUES (2);
INSERT INTO t2 (f1) VALUES (3);
raise exception 'Oooooppsss!';
INSERT INTO t2 (f1) VALUES (4);
RETURN 1;
EXCEPTION
WHEN OTHERS THEN RETURN 0;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;
tmp=# BEGIN;
BEGIN
tmp=# INSERT INTO t2 (f1) VALUES (5);
INSERT 0 1
tmp=# SELECT fntrans();
fntrans
---------
0
(1 row)
tmp=# COMMIT;
COMMIT
tmp=# select * from t2;
f1
----
5
(1 row)
...
Рейтинг: 0 / 0
08.08.2016, 12:02
    #39288198
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции и транзакции
Ролг ХупинТ.е. после COMMIT, выполнился ROLLBACK и INSERT который был вызван внутри транзакции перед функцией не выполнился.
Неверное утверждение, тут COMMIT-а не было, вместо него произошел ROLLBACK.
Именно так стоит рассматривать этот ответ сервера.

Ролг Хупин2. Берём вариант функции C обработкой исключения:
CREATE OR REPLACE FUNCTION "public"."fntrans" (
)
RETURNS integer AS
$body$
declare d double precision;
BEGIN
INSERT INTO t2 (f1) VALUES (1);
INSERT INTO t2 (f1) VALUES (2);
INSERT INTO t2 (f1) VALUES (3);
raise exception 'Oooooppsss!';
INSERT INTO t2 (f1) VALUES (4);
RETURN 1;
EXCEPTION
WHEN OTHERS THEN RETURN 0;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;
tmp=# BEGIN;
BEGIN
tmp=# INSERT INTO t2 (f1) VALUES (5);
INSERT 0 1
tmp=# SELECT fntrans();
fntrans
---------
0
(1 row)
tmp=# COMMIT;
COMMIT
tmp=# select * from t2;
f1
----
5
(1 row)
Как и ожидалось.
...
Рейтинг: 0 / 0
08.08.2016, 12:03
    #39288199
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции и транзакции
Ролг Хупиня в приложении делаю запрос

Код: sql
1.
select fun1();



fun1() вызывает fun2(), которая вызывает fun3()

fun3 успевает что-то сделать, а fun2 генерирует исключение
(явно или нет, не важно),
результат - роллбэк всего запроса select fun1();
включая роллбэк действий, уже сделанных fun3()

так?Да, именно так.
...
Рейтинг: 0 / 0
08.08.2016, 15:14
    #39288365
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции и транзакции
[quot Ролг Хупин]vyegorovРолг Хупин,



fun1() вызывает fun2(), которая вызывает fun3()

fun3 успевает что-то сделать, а fun2 генерирует исключение
(явно или нет, не важно),
результат - роллбэк всего запроса select fun1();
включая роллбэк действий, уже сделанных fun3()

так?

Да так.


--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
08.08.2016, 16:03
    #39288405
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции и транзакции
[quot Maxim Boguk]Ролг Хупинпропущено...


Да так.


--
Maxim Boguk
www.postgresql-consulting.ru

ясно, дальше

Сделал три функции, 1->2->3

Комбинирую raise exception например так, в любом случае в таблице записей нет.
А можно ли во внутренней функции так поймать exception, чтобы вызвавшая её все-таки сработала?



Код: sql
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.
create table t2(ID SERIAL PRIMARY KEY, f1 INTeger);

CREATE OR REPLACE FUNCTION "public"."fntrans" (
)
RETURNS integer AS
$body$
declare d double precision;
BEGIN
raise notice 'fntrans';
  INSERT INTO t2 (f1) VALUES (1);
  INSERT INTO t2 (f1) VALUES (2);
  INSERT INTO t2 (f1) VALUES (3);

  select fntrans2();
--  raise exception 'Oooooppsss!';
  INSERT INTO t2 (f1) VALUES (4);
  RETURN 1;
EXCEPTION  
  WHEN OTHERS THEN 
  BEGIN 
  	raise notice 'fntrans exception';
	RETURN 0;
  END;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;

CREATE OR REPLACE FUNCTION public.fntrans2 (
)
RETURNS integer AS
$body$
declare d double precision;
BEGIN
  raise notice 'fntrans2';
  INSERT INTO t2 (f1) VALUES (10);
  INSERT INTO t2 (f1) VALUES (22);
  INSERT INTO t2 (f1) VALUES (30);
  select fntrans3();
  --raise exception 'Oooooppsss 2!';
  INSERT INTO t2 (f1) VALUES (40);
  RETURN 1;
EXCEPTION  
  WHEN OTHERS THEN RETURN 0;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;

CREATE OR REPLACE FUNCTION public.fntrans3 (
)
RETURNS integer AS
$body$
declare d double precision;
BEGIN
   raise notice 'fntrans3';
    
  INSERT INTO t2 (f1) VALUES (100);
  INSERT INTO t2 (f1) VALUES (200);
  INSERT INTO t2 (f1) VALUES (300);
  raise exception 'Oooooppsss 3!';
  INSERT INTO t2 (f1) VALUES (400);
  RETURN 1;
EXCEPTION  
  WHEN OTHERS THEN RETURN 0;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;


SELECT fntrans();

Select * from t2;

-- записей нет
...
Рейтинг: 0 / 0
08.08.2016, 16:34
    #39288433
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции и транзакции
Ролг Хупин
Код: sql
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.
CREATE OR REPLACE FUNCTION public.fntrans2 (
)
RETURNS integer AS
$body$
declare d double precision;
BEGIN
  raise notice 'fntrans2';
  INSERT INTO t2 (f1) VALUES (10);
  INSERT INTO t2 (f1) VALUES (22);
  INSERT INTO t2 (f1) VALUES (30);

  BEGIN --savepoint? ,kzlm
      select fntrans3();
      raise exception 'Oooooppsss 2!';
       INSERT INTO t2 (f1) VALUES (40);
       RETURN 1;
  EXCEPTION  
  WHEN OTHERS THEN RETURN 0;
  END;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;
...
Рейтинг: 0 / 0
08.08.2016, 17:00
    #39288458
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции и транзакции
qwwqРолг Хупин
Код: sql
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.
CREATE OR REPLACE FUNCTION public.fntrans2 (
)
RETURNS integer AS
$body$
declare d double precision;
BEGIN
  raise notice 'fntrans2';
  INSERT INTO t2 (f1) VALUES (10);
  INSERT INTO t2 (f1) VALUES (22);
  INSERT INTO t2 (f1) VALUES (30);

  BEGIN --savepoint? ,kzlm
      select fntrans3();
      raise exception 'Oooooppsss 2!';
       INSERT INTO t2 (f1) VALUES (40);
       RETURN 1;
  EXCEPTION  
  WHEN OTHERS THEN RETURN 0;
  END;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;




изменил так, как написано, но после вызова 1->2->3

SELECT fntrans();

Select * from t2;

таблица пустая
...
Рейтинг: 0 / 0
08.08.2016, 17:02
    #39288462
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции и транзакции
Кроме всего вот аутпут, который показывает, что то исключение все-таки пробило на самый верх

NOTICE: fntrans
NOTICE: fntrans2
CONTEXT: SQL statement "select fntrans2()"
PL/pgSQL function fntrans() line 8 at SQL statement
NOTICE: fntrans3
CONTEXT: SQL statement "select fntrans3()"
PL/pgSQL function fntrans2() line 10 at SQL statement
SQL statement "select fntrans2()"
PL/pgSQL function fntrans() line 8 at SQL statement
NOTICE: fntrans exception
...
Рейтинг: 0 / 0
08.08.2016, 17:31
    #39288481
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции и транзакции
Ролг Хупин,

мальчик , ты дебил ?

разберись сначала с единственным сейвпойнтом

Код: sql
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.
create table t2(ID SERIAL PRIMARY KEY, f1 INTeger);

CREATE OR REPLACE FUNCTION public.fntrans2 (
)
RETURNS integer AS
$body$
declare d double precision;
BEGIN
	raise notice 'fntrans2';
	INSERT INTO t2 (f1) VALUES (10);
	INSERT INTO t2 (f1) VALUES (22);
	INSERT INTO t2 (f1) VALUES (30);

	BEGIN --savepoint? ,kzlm

			raise exception 'Oooooppsss 2!';
			INSERT INTO t2 (f1) VALUES (40);
			RETURN 1;
	EXCEPTION	
	WHEN OTHERS THEN RETURN 0;
	END;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE;

SELECT public.fntrans2();
SELECT * FROM t2;
---------------------
1;10
2;22
3;30


потом нанизывай их одно на другое.
И если подавляешь чужое исключение -- выводи хотя бы его следы (SQLERRM SQLSTATE) в своих сообщениях -- могабыть оно вообще на что--то другое матерится.
...
Рейтинг: 0 / 0
08.08.2016, 17:37
    #39288488
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции и транзакции
qwwqРолг Хупин,

мальчик , ты дебил ?

разберись сначала с единственным сейвпойнтом

Код: sql
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.
create table t2(ID SERIAL PRIMARY KEY, f1 INTeger);

CREATE OR REPLACE FUNCTION public.fntrans2 (
)
RETURNS integer AS
$body$
declare d double precision;
BEGIN
	raise notice 'fntrans2';
	INSERT INTO t2 (f1) VALUES (10);
	INSERT INTO t2 (f1) VALUES (22);
	INSERT INTO t2 (f1) VALUES (30);

	BEGIN --savepoint? ,kzlm

			raise exception 'Oooooppsss 2!';
			INSERT INTO t2 (f1) VALUES (40);
			RETURN 1;
	EXCEPTION	
	WHEN OTHERS THEN RETURN 0;
	END;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE;

[color=red]SELECT public.fntrans2();
SELECT * FROM t2;[/color]
---------------------
1;10
2;22
3;30


потом нанизывай их одно на другое.
И если подавляешь чужое исключение -- выводи хотя бы его следы (SQLERRM SQLSTATE) в своих сообщениях -- могабыть оно вообще на что--то другое матерится.

Я будуу обращаться к вам на вы, судя по всему у вас с нервной системой не все в порядке
И я не хотел бы давать вам оценку.

Разница есть в том примере. который я привел и в вашем?

SELECT fntrans();
Select * from t2;

Так вот я задал вопрос про три функции и привел их.
Вы дали совет как исправить, но вызов не тот, который в моем примере, а следовательно это не ответ на мой вопрос.
...
Рейтинг: 0 / 0
08.08.2016, 17:55
    #39288505
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции и транзакции
Ролг ХупинqwwqРолг Хупин,

мальчик , ты дебил ?

разберись сначала с единственным сейвпойнтом

Код: sql
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.
create table t2(ID SERIAL PRIMARY KEY, f1 INTeger);

CREATE OR REPLACE FUNCTION public.fntrans2 (
)
RETURNS integer AS
$body$
declare d double precision;
BEGIN
	raise notice 'fntrans2';
	INSERT INTO t2 (f1) VALUES (10);
	INSERT INTO t2 (f1) VALUES (22);
	INSERT INTO t2 (f1) VALUES (30);

	BEGIN --savepoint? ,kzlm

			raise exception 'Oooooppsss 2!';
			INSERT INTO t2 (f1) VALUES (40);
			RETURN 1;
	EXCEPTION	
	WHEN OTHERS THEN RETURN 0;
	END;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE;

[color=red]SELECT public.fntrans2();
SELECT * FROM t2;[/color]
---------------------
1;10
2;22
3;30


потом нанизывай их одно на другое.
И если подавляешь чужое исключение -- выводи хотя бы его следы (SQLERRM SQLSTATE) в своих сообщениях -- могабыть оно вообще на что--то другое матерится.

Я будуу обращаться к вам на вы, судя по всему у вас с нервной системой не все в порядке
И я не хотел бы давать вам оценку.

Разница есть в том примере. который я привел и в вашем?

SELECT fntrans();
Select * from t2;

Так вот я задал вопрос про три функции и привел их.
Вы дали совет как исправить, но вызов не тот, который в моем примере, а >>>следовательно<<< это не ответ на мой вопрос.

таки да, мальчик ещё и не читатель

ещё раз повторяю -- от простого -- к сложному
сначала -- поведение при одном сейвпойнте в цепочке
и только потом --- инжекция туда новых проблем
а широко шагать -- штаны порвёшь
...
Рейтинг: 0 / 0
08.08.2016, 18:02
    #39288512
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции и транзакции
qwwqРолг Хупинпропущено...


Я будуу обращаться к вам на вы, судя по всему у вас с нервной системой не все в порядке
И я не хотел бы давать вам оценку.

Разница есть в том примере. который я привел и в вашем?

SELECT fntrans();
Select * from t2;

Так вот я задал вопрос про три функции и привел их.
Вы дали совет как исправить, но вызов не тот, который в моем примере, а >>>следовательно<<< это не ответ на мой вопрос.

таки да, мальчик ещё и не читатель

ещё раз повторяю -- от простого -- к сложному
сначала -- поведение при одном сейвпойнте в цепочке
и только потом --- инжекция туда новых проблем
а широко шагать -- штаны порвёшь

У вас навязчивое желание называть юзеров "мальчег", это нетрадициионо.

Ладно, к вопросу:


Если бы я был в курсе я бы не задавал вопросы, хотелось бы разобраться.

"поведение при одном сейвпойнте в цепочке"

Да, при вызове fntrans2() exception ловится внутри функции при ее вызове.

Вопрос: почему этот exception пробивает в вызвавшую функцию при вызове
fntrans()->fntrans2()
?
...
Рейтинг: 0 / 0
08.08.2016, 18:09
    #39288513
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции и транзакции
Ролг Хупин

У вас навязчивое желание называть юзеров "мальчег", это нетрадициионо.
не юзеров, а дебилов. когда они ещё и мельтешат не думая.
Ролг Хупин
Ладно, к вопросу:


Если бы я был в курсе я бы не задавал вопросы, хотелось бы разобраться.

"поведение при одном сейвпойнте в цепочке"

Да, при вызове fntrans2() exception ловится внутри функции при ее вызове.

Вопрос: почему этот exception пробивает в вызвавшую функцию при вызове
fntrans()->fntrans2()
?

приведите весь текст своего кейса (заново, целиком, в спойлере) -- и будет ясно, что именно вы делаете, и, что из этого получается.

раз не хотите по шагам -- давайте весь ваш бред целиком

мну, например, совсем не очевидно, что "пробивает" именно этот, и именно там.
...
Рейтинг: 0 / 0
08.08.2016, 18:22
    #39288515
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции и транзакции
qwwqРолг Хупин

У вас навязчивое желание называть юзеров "мальчег", это нетрадициионо.
не юзеров, а дебилов. когда они ещё и мельтешат не думая.
Ролг Хупин
Ладно, к вопросу:


Если бы я был в курсе я бы не задавал вопросы, хотелось бы разобраться.

"поведение при одном сейвпойнте в цепочке"

Да, при вызове fntrans2() exception ловится внутри функции при ее вызове.

Вопрос: почему этот exception пробивает в вызвавшую функцию при вызове
fntrans()->fntrans2()
?

приведите весь текст своего кейса (заново, целиком, в спойлере) -- и будет ясно, что именно вы делаете, и, что из этого получается.

Так я его и привел в вопросе
раз не хотите по шагам -- давайте весь ваш бред целиком

мну, например, совсем не очевидно, что "пробивает" именно этот, и именно там.

Зря вы так: " не юзеров, а дебилов. когда они ещё и мельтешат не думая. "
вы вряд ли дебил, вроде соображаете.
Хотя, одно другому не мешает, а иногда и совмещается ;-)

Спасибо вам, добрый юзер,
разобрался наконец-то, это был другой эксцепшын, родной для функции fntrans

из-за вызова в ней
select fntrans2(), типа дискард дата и пр., заменил на perform fntrans2() и всё сработало!


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


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