powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как вызвать процедуру с out параметром
6 сообщений из 6, страница 1 из 1
Как вызвать процедуру с out параметром
    #40086327
x17.mstu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите что нужно поменять чтобы вызвать процедура с out параметром

wf_load_id_new OUT не получается сделать- сделал INOUT

Код: 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.
create or replace procedure tmd.etl_sp_start_wf
	(
	wf_name IN varchar(100),
	wf_load_id_new INOUT numeric
	)
LANGUAGE plpgsql
AS $$
DECLARE
	wf_id integer;
	wf_load_id integer;
	--wf_load_id_new tmd.etl_wf_load.wf_load_id%TYPE;
BEGIN
 wf_load_id_new := NULL; 
 
 select wf_id
 into wf_id
 from tmd.etl_wf
 where wf_name = wf_name;
 
 if wf_id is null then
   RAISE EXCEPTION 'Unknown name of Workflow %', wf_name;
 END IF;
 
 Select wf_load_id
 into wf_load_id
 from tmd.etL_wf_load
 where wf_id = wf_id 
 		and (end_date is NULL or status = 'START');
		
 if wf_load_id is not null then
   RAISE EXCEPTION 'Workflow is already running, wf_load_id %', wf_load_id;
 END IF;
 
 BEGIN 
 Insert into tmd.etl_wf_load(wf_id, status, start_date, end_date, description)
 Select 
 	wf_id = wf_id
   , status = 'START'
   , start_date = current_date
   , end_date = NULL
   ,description = NULL
   RETURNING wf_id INTO wf_load_id_new;
   COMMIT;
   --wf_load_id_new :=  wf_id;
 EXCEPTION 
  WHEN OTHERS THEN ROLLBACK;
END;
END;
$$
...
Рейтинг: 0 / 0
Как вызвать процедуру с out параметром
    #40086411
Misha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вызвать или создать?
если создать - доку читали?
докаРежим аргумента: IN, INOUT или VARIADIC. По умолчанию подразумевается IN. (Режим OUT для процедур в настоящее время не поддерживается. Используйте вместо него INOUT.)
тыц
...
Рейтинг: 0 / 0
Как вызвать процедуру с out параметром
    #40086417
x17.mstu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Misha111,

Читал

Код: 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.
create or replace procedure tmd.etl_sp_start_wf
	(
	_wf_name IN varchar(100),
	wf_load_id_new INOUT numeric
	)
LANGUAGE plpgsql
AS $$
DECLARE
	_wf_id integer;
	_wf_load_id integer;
	--wf_load_id_new tmd.etl_wf_load.wf_load_id%TYPE;
BEGIN
 wf_load_id_new := NULL; 
BEGIN
 select wf_id
 into _wf_id
 from tmd.etl_wf
 where wf_name = _wf_name;
 
 if _wf_id is null then
   RAISE EXCEPTION 'Unknown name of Workflow %', _wf_name;
 END IF;
 
 Select wf_load_id
 into _wf_load_id
 from tmd.etL_wf_load
 where wf_id = _wf_id 
 		and (end_date is NULL or status = 'START');
		
 if _wf_load_id is not null then
   RAISE NOTICE 'Illegal operation: %', SQLERRM;
   RAISE EXCEPTION 'Workflow is already running, wf_load_id %', _wf_load_id;
 END IF;
 
insert into tmd.etl_wf_load(wf_id, status, start_date, end_date, description)
values(_wf_id, 'START', current_date, NULL, NULL);
   COMMIT;
   wf_load_id_new :=  _wf_id;
 EXCEPTION 
  WHEN OTHERS THEN
   RAISE NOTICE 'Rollback'; 
   RAISE NOTICE 'Illegal operation: %', SQLERRM;
  ROLLBACK;
END;
END;
$$

При вызове 
DO
$$
DECLARE res numeric;
BEGIN
    CALL tmd.etl_sp_start_wf('dev_wf_r_ai_fx_spreds_model', res);
    RAISE NOTICE '%', res;
END
$$



Ошибка
ЗАМЕЧАНИЕ: Rollback
ЗАМЕЧАНИЕ: Illegal operation: фиксировать транзакцию при наличии активных подтранзакций нельзя
ЗАМЕЧАНИЕ: <NULL>
DO
...
Рейтинг: 0 / 0
Как вызвать процедуру с out параметром
    #40086420
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
x17.mstu,

Вам же явным образом написали: нельзя делать commit/rollback внутри exception handler.
Что именно непонятно?

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Как вызвать процедуру с out параметром
    #40086513
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Misha111

докаРежим аргумента: IN, INOUT или VARIADIC. По умолчанию подразумевается IN. (Режим OUT для процедур в настоящее время не поддерживается. Используйте вместо него INOUT.)

тыц
Кстати, в 14 версии появятся и OUT параметры.
...
Рейтинг: 0 / 0
Как вызвать процедуру с out параметром
    #40086519
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
x17.mstu,

Предположу, что уровень изоляции транзакций у вас по умолчанию - READ COMMITTED.

Если процедура может вызываться параллельно из разных сеансов, то вот такой код чреват потенциальными ошибками:

Код: sql
1.
2.
3.
4.
5.
SELECT .. INTO var FROM ..

IF var .. RAISE ERROR ..

INSERT ..


Принимать решение о дальнейших действиях на основании значения переменной var нельзя, потому что после завершения SELECT состояние БД уже могло измениться.

В вашем случае запросто могут возникнуть ситуации, когда две параллельные транзакции, вызывающие процедуру, попытаются вставить запись в tmd.etl_wf_load. Первая успеет это сделать, вторая упадет с ошибкой уникальности (если ограничение уникальности на таблице имеется, конечно).

Сначала бы с этим разобраться, а потом уже commit в процедуру встраивать.

Если без секции EXCEPTION никак не обойтись, то можно что-то такое:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
BEGIN
    BEGIN
        -- обработка
    EXCEPTION
        WHEN OTHERS THEN
            -- обработка ошибок
    END;
    COMMIT;
END;


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


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