Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Хмурый анонимный блок  [new]
per
Member

Откуда:
Сообщений: 100
Добрый день.

Подскажите пожалуйста как можно прервать выполнение анонимного блока при определенном условии?


Например если в нем переменная count1 больше 1000 стала.



Внутри блоков куча циклов и всего другого.


EXIT вызывает ошибку:

ОШИБКА: конец функции достигнут без RETURN
SQL-состояние: 2F005
Контекст: функция PL/pgSQL inline_code_block
4 фев 20, 18:04    [22072993]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
per
Member

Откуда:
Сообщений: 100
Что-то типа goto надо или типа того
4 фев 20, 18:19    [22073007]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
entrypoint
Member

Откуда:
Сообщений: 227
per,

DO 
$$
<<ablock>>
DECLARE 
	count INT DEFAULT 0;
BEGIN 
	LOOP 
		count = count + 1;
		RAISE NOTICE '%', count;
		EXIT WHEN count > 999;
	END LOOP;
	
	RAISE NOTICE 'работа продолжается после выхода из цикла';	

        LOOP 
		EXIT ablock WHEN count > 999;
		RAISE NOTICE 'сюда не попадаем';
		count = count + 1;
		RAISE NOTICE '%', count;
	END LOOP;

    RAISE NOTICE 'и сюда не попадаем';	
END; 
$$ LANGUAGE 'plpgsql'
4 фев 20, 18:38    [22073025]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
Guzya
Member

Откуда:
Сообщений: 415
Return что-нибудь.
4 фев 20, 18:38    [22073027]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
per
Member

Откуда:
Сообщений: 100
entrypoint, Guzya, большое спасибо за ответы!

Это похоже на то что требуется!


Однако возникло два вопроса:
5 фев 20, 10:41    [22073448]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
per
Member

Откуда:
Сообщений: 100
1-й вопрос


[quot entrypoint#22073025]per,

[src PLSQL]
DO 
$$
<<ablock>>
DECLARE 
	count INT DEFAULT 0;
BEGIN 
	LOOP 
		count = count + 1;
		RAISE NOTICE '%', count;
		EXIT WHEN count > 999;
	END LOOP;
	
	RAISE NOTICE 'работа продолжается после выхода из цикла';	

        LOOP 
		EXIT ablock WHEN count > 999;
		RAISE NOTICE 'сюда не попадаем';
		count = count + 1;
		RAISE NOTICE '%', count;
	END LOOP;

    RAISE NOTICE 'и сюда не попадаем';	   --<---------  ПОЧЕМУ???  о_О
END; 
$$ LANGUAGE 'plpgsql'
[/quot][/SRC]





Ну в циклах прописано что exit по условию.


Но почему не попадаем в
" RAISE NOTICE 'и сюда не попадаем'; " ?
5 фев 20, 10:43    [22073450]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
per
Member

Откуда:
Сообщений: 100
Второй вопрос:

Guzya
Return что-нибудь.




Куда его в анонимном блоке вставить?


Куда не вставлю - везде ошибку выдает :-(((

+


DO 
$$
<<ablock>>
DECLARE 
	count INT DEFAULT 0;
BEGIN 
	LOOP 
		count = count + 1;
		RAISE NOTICE '%', count;
		EXIT WHEN count > 999;
	END LOOP;
	
	RAISE NOTICE 'работа продолжается после выхода из цикла';	

        LOOP 
		EXIT ablock WHEN count > 999;
		RAISE NOTICE 'сюда не попадаем';
		count = count + 1;
		RAISE NOTICE '%', count;
	END LOOP;

    RAISE NOTICE 'и сюда не попадаем';	
RETURN;
END; 
$$ LANGUAGE 'plpgsql'



ОШИБКА: конец функции достигнут без RETURN
SQL-состояние: 2F005
Контекст: функция PL/pgSQL inline_code_block
5 фев 20, 10:46    [22073452]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
entrypoint
Member

Откуда:
Сообщений: 227
DO 
$$
/*!!!*/<<ablock>>/*!!!*/
DECLARE 
	count INT DEFAULT 0;
BEGIN 
	LOOP 
		count = count + 1;
		RAISE NOTICE '%', count;
		EXIT WHEN count > 999;
	END LOOP;
	
	RAISE NOTICE 'работа продолжается после выхода из цикла';	

        LOOP 
		EXIT /*!!!*/ablock/*!!!*/  WHEN count > 999;
		RAISE NOTICE 'сюда не попадаем';
		count = count + 1;
		RAISE NOTICE '%', count;
	END LOOP;

    RAISE NOTICE 'и сюда не попадаем';    --<---------  ПОЧЕМУ???  о_О
END; 
$$ LANGUAGE 'plpgsql'






Ну в циклах прописано что exit по условию.


Но почему не попадаем в
" RAISE NOTICE 'и сюда не попадаем'; " ?[/quot]
5 фев 20, 11:19    [22073481]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
entrypoint
Member

Откуда:
Сообщений: 227
per
Второй вопрос:

Guzya
Return что-нибудь.




Куда его в анонимном блоке вставить?


Куда не вставлю - везде ошибку выдает :-(((

+


DO 
$$
<<ablock>>
DECLARE 
	count INT DEFAULT 0;
BEGIN 
	LOOP 
		count = count + 1;
		RAISE NOTICE '%', count;
		EXIT WHEN count > 999;
	END LOOP;
	
	RAISE NOTICE 'работа продолжается после выхода из цикла';	

        LOOP 
		EXIT ablock WHEN count > 999;
		RAISE NOTICE 'сюда не попадаем';
		count = count + 1;
		RAISE NOTICE '%', count;
	END LOOP;

    RAISE NOTICE 'и сюда не попадаем';	
RETURN;
END; 
$$ LANGUAGE 'plpgsql'



ОШИБКА: конец функции достигнут без RETURN
SQL-состояние: 2F005
Контекст: функция PL/pgSQL inline_code_block



Можно больше кода для примера ?
Какой код выдает такую ошибку ?
5 фев 20, 11:20    [22073483]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
per
Member

Откуда:
Сообщений: 100
Так, если return ставлю перед вторым циклом(добавля IF по условию) - то ошибки не возникает:


DO 
$$
<<ablock>>
DECLARE 
	count INT DEFAULT 0;
BEGIN 
	LOOP 
		count = count + 1;
		RAISE NOTICE '%', count;
		EXIT WHEN count > 999;
	END LOOP;
	
	RAISE NOTICE 'работа продолжается после выхода из цикла';	
IF (count > 999) THEN RETURN;END IF;--<-- ТУТА!!!!
        LOOP 
		EXIT ablock WHEN count > 999;
		RAISE NOTICE 'сюда не попадаем';
		count = count + 1;
		RAISE NOTICE '%', count;
	END LOOP;

    RAISE NOTICE 'и сюда не попадаем';	

END; 
$$ LANGUAGE 'plpgsql'




Это получается RETURN с условием надо перед каждым циклом вставлять? о_О

Сообщение было отредактировано: 5 фев 20, 11:35
5 фев 20, 11:30    [22073494]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
entrypoint
Member

Откуда:
Сообщений: 227
per,

У вас где-то ошибка в логике, где-то в коде есть блок из которого не досягаем RETURN

CREATE FUNCTION try() RETURNS void AS 
$$
DECLARE 
	count INT DEFAULT 0;
BEGIN 
	LOOP 
		count = count + 1;
		RAISE NOTICE '%', count;
		EXIT WHEN count > 999;
	END LOOP;
	
	RAISE NOTICE 'работа продолжается после выхода из цикла';	
	
   <<ablock>> 
   BEGIN 
	   LOOP 
			EXIT ablock WHEN count > 999;
			RAISE NOTICE 'сюда не попадаем';
			count = count + 1;
			RAISE NOTICE '%', count;
           END LOOP;

	RAISE NOTICE 'и сюда не попадаем';
	count = count * 1000;
	RAISE NOTICE '%', count;
    END;

    RAISE NOTICE 'сюда попадаем';	
	
    RAISE NOTICE 'Значение count[%] не изменилось после обработки его первым циклом.', count;
    RAISE NOTICE 'Второй цикл, и прямое изменение значения оказались за пределами видимости';

    RETURN;
END; 
$$ LANGUAGE 'plpgsql'


Сообщение было отредактировано: 5 фев 20, 11:53
5 фев 20, 11:52    [22073529]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
qwwq
Member

Откуда:
Сообщений: 2889
entrypoint,

метка не там
DO
$$
<<generateerror>> -- Д,б
begin
	<<generateNOerror>>
	loop
		raise notice 'yes';
		exit generateNOerror;
	end loop;
	raise notice 'yes2';
	exit generateerror;
	raise notice 'no';
end;
-- попытка вывалиться сюда
$$
5 фев 20, 12:01    [22073541]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3411
per
1-й вопрос


[quot entrypoint#22073025]per,

[src PLSQL]
DO 
$$
<<ablock>>
DECLARE 
	count INT DEFAULT 0;
BEGIN 
	LOOP 
		count = count + 1;
		RAISE NOTICE '%', count;
		EXIT WHEN count > 999;
	END LOOP;
	
	RAISE NOTICE 'работа продолжается после выхода из цикла';	

        LOOP 
		EXIT ablock WHEN count > 999;
		RAISE NOTICE 'сюда не попадаем';
		count = count + 1;
		RAISE NOTICE '%', count;
	END LOOP;

    RAISE NOTICE 'и сюда не попадаем';	   --<---------  ПОЧЕМУ???  о_О
END; 
$$ LANGUAGE 'plpgsql'
[/SRC]





Ну в циклах прописано что exit по условию.


Но почему не попадаем в
" RAISE NOTICE 'и сюда не попадаем'; " ?[/quot]

Может там пропущен вопрос, так лучше?
RAISE NOTICE 'и сюда не попадаем И ПОЧЕМУ?'; "
5 фев 20, 12:09    [22073555]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3411
entrypoint
per,

DO 
$$
<<ablock>>
DECLARE 
	count INT DEFAULT 0;
BEGIN 
	LOOP 
		count = count + 1;
		RAISE NOTICE '%', count;
		EXIT WHEN count > 999;
	END LOOP;
	
	RAISE NOTICE 'работа продолжается после выхода из цикла';	

        LOOP 
		EXIT ablock WHEN count > 999;
		RAISE NOTICE 'сюда не попадаем';
		count = count + 1;
		RAISE NOTICE '%', count;
	END LOOP;

    RAISE NOTICE 'и сюда не попадаем';	
END; 
$$ LANGUAGE 'plpgsql'



Но ТС написал "Внутри блоков куча циклов и всего другого.", а здесь нет кучи циклов, кроме того, нету "всего другого"
5 фев 20, 12:11    [22073562]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
per
Member

Откуда:
Сообщений: 100
entrypoint
per,

У вас где-то ошибка в логике, где-то в коде есть блок из которого не досягаем RETURN

CREATE FUNCTION try() RETURNS void AS 
$$
DECLARE 
	count INT DEFAULT 0;
BEGIN 
	LOOP 
		count = count + 1;
		RAISE NOTICE '%', count;
		EXIT WHEN count > 999;
	END LOOP;
	
	RAISE NOTICE 'работа продолжается после выхода из цикла';	
	
   <<ablock>> 
   BEGIN 
	   LOOP 
			EXIT ablock WHEN count > 999;
			RAISE NOTICE 'сюда не попадаем';
			count = count + 1;
			RAISE NOTICE '%', count;
           END LOOP;

	RAISE NOTICE 'и сюда не попадаем';
	count = count * 1000;
	RAISE NOTICE '%', count;
    END;

    RAISE NOTICE 'сюда попадаем';	
	
    RAISE NOTICE 'Значение count[%] не изменилось после обработки его первым циклом.', count;
    RAISE NOTICE 'Второй цикл, и прямое изменение значения оказались за пределами видимости';

    RETURN;
END; 
$$ LANGUAGE 'plpgsql'



В том-то и дело что у меня не функция, а анонимный блок.
5 фев 20, 12:12    [22073564]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
per
Member

Откуда:
Сообщений: 100
entrypoint
per
Второй вопрос:

пропущено...




Куда его в анонимном блоке вставить?


Куда не вставлю - везде ошибку выдает :-(((

+


DO 
$$
<<ablock>>
DECLARE 
	count INT DEFAULT 0;
BEGIN 
	LOOP 
		count = count + 1;
		RAISE NOTICE '%', count;
		EXIT WHEN count > 999;
	END LOOP;
	
	RAISE NOTICE 'работа продолжается после выхода из цикла';	

        LOOP 
		EXIT ablock WHEN count > 999;
		RAISE NOTICE 'сюда не попадаем';
		count = count + 1;
		RAISE NOTICE '%', count;
	END LOOP;

    RAISE NOTICE 'и сюда не попадаем';	
RETURN;
END; 
$$ LANGUAGE 'plpgsql'



ОШИБКА: конец функции достигнут без RETURN
SQL-состояние: 2F005
Контекст: функция PL/pgSQL inline_code_block



Можно больше кода для примера ?
Какой код выдает такую ошибку ?


Тот, что в этом сообщении и приведен.
5 фев 20, 12:13    [22073565]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
entrypoint
Member

Откуда:
Сообщений: 227
per

В том-то и дело что у меня не функция, а анонимный блок.


вот анонимный блок

DO
$$
DECLARE 
	count INT DEFAULT 0;
BEGIN 
	LOOP 
		count = count + 1;
		RAISE NOTICE '%', count;
		EXIT WHEN count > 999;
	END LOOP;
	
	RAISE NOTICE 'работа продолжается после выхода из цикла';	
	
   <<ablock>> 
   BEGIN 
	   LOOP 
			EXIT ablock WHEN count > 999;
			RAISE NOTICE 'сюда не попадаем';
			count = count + 1;
			RAISE NOTICE '%', count;
           END LOOP;

	RAISE NOTICE 'и сюда не попадаем';
	count = count * 1000;
	RAISE NOTICE '%', count;
    END;

    RAISE NOTICE 'сюда попадаем';	
	
    RAISE NOTICE 'Значение count[%] не изменилось после обработки его первым циклом.', count;
    RAISE NOTICE 'Второй цикл, и прямое изменение значения оказались за пределами видимости';

    RETURN;
END; 
$$ LANGUAGE 'plpgsql'
5 фев 20, 12:16    [22073573]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
Victor Nevsky
Member

Откуда:
Сообщений: 81
per, обернуть begin/end
DO 
$$
BEGIN
  <<ablock>>
  DECLARE 
	count INT DEFAULT 0;
  BEGIN 
	LOOP 
		count = count + 1;
		RAISE NOTICE '%', count;
		EXIT WHEN count > 999;
	END LOOP;
	
	RAISE NOTICE 'работа продолжается после выхода из цикла';	

        LOOP 
		EXIT ablock WHEN count > 999;
		RAISE NOTICE 'сюда не попадаем';
		count = count + 1;
		RAISE NOTICE '%', count;
	END LOOP;

      RAISE NOTICE 'и сюда не попадаем';	
  END;    
END;
$$ LANGUAGE 'plpgsql'
5 фев 20, 12:17    [22073575]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
per
Member

Откуда:
Сообщений: 100
qwwq
entrypoint,

метка не там
DO
$$
<<generateerror>> -- Д,б
begin
	<<generateNOerror>>
	loop
		raise notice 'yes';
		exit generateNOerror;
	end loop;
	raise notice 'yes2';
	exit generateerror;
	raise notice 'no';
end;
-- попытка вывалиться сюда
$$





А куда тогда надо ставить RETURN?



DO
$$
<<generateerror>> -- Д,б
begin
	<<generateNOerror>>
	loop
		raise notice 'yes';
		exit generateNOerror;
	end loop;
	raise notice 'yes2';
	exit generateerror;
	raise notice 'no';
RETURN;            --<--------ТУТА
end;
-- попытка вывалиться сюда
$$




ЗАМЕЧАНИЕ: yes
ЗАМЕЧАНИЕ: yes2


ОШИБКА: конец функции достигнут без RETURN
CONTEXT: функция PL/pgSQL inline_code_block
********** Ошибка **********

ОШИБКА: конец функции достигнут без RETURN
SQL-состояние: 2F005
Контекст: функция PL/pgSQL inline_code_block








DO
$$
<<generateerror>> -- Д,б
begin
	<<generateNOerror>>
	loop
		raise notice 'yes';
		exit generateNOerror;
	end loop;
	raise notice 'yes2';
	exit generateerror;
	raise notice 'no';
end;
-- попытка вывалиться сюда
RETURN;            --<--------ТУТА
$$



ОШИБКА: ошибка синтаксиса (примерное положение: "RETURN")
LINE 15: RETURN; --<--------ТУТА
^
********** Ошибка **********

ОШИБКА: ошибка синтаксиса (примерное положение: "RETURN")
SQL-состояние: 42601
Символ: 217
5 фев 20, 12:19    [22073581]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
per
Member

Откуда:
Сообщений: 100
Victor Nevsky
per, обернуть begin/end
DO 
$$
BEGIN
  <<ablock>>
  DECLARE 
	count INT DEFAULT 0;
  BEGIN 
	LOOP 
		count = count + 1;
		RAISE NOTICE '%', count;
		EXIT WHEN count > 999;
	END LOOP;
	
	RAISE NOTICE 'работа продолжается после выхода из цикла';	

        LOOP 
		EXIT ablock WHEN count > 999;
		RAISE NOTICE 'сюда не попадаем';
		count = count + 1;
		RAISE NOTICE '%', count;
	END LOOP;

      RAISE NOTICE 'и сюда не попадаем';	
  END;    
END;
$$ LANGUAGE 'plpgsql'




Ваш вариант отработал без ошибок.


Но как? Получается RETURN вообще не надо ставить?
5 фев 20, 12:22    [22073584]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
Victor Nevsky
Member

Откуда:
Сообщений: 81
per, retun - прекращение работы анонимного блока, а вам нужен выход из именованого блока - exit
у вас весь именованный блок = анонимный, то есть получается exit в никуда.
5 фев 20, 12:30    [22073603]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
per
Member

Откуда:
Сообщений: 100
Victor Nevsky
per, retun - прекращение работы анонимного блока, а вам нужен выход из именованого блока - exit
у вас весь именованный блок = анонимный, то есть получается exit в никуда.



Смылс такой, что мне надо прервать работы всего анонимного блока при определенном условии. (это условие срабатывает в 10% случаев)



Как сделать в таком случае?
5 фев 20, 12:33    [22073607]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
per
Member

Откуда:
Сообщений: 100
Victor Nevsky,
Вот такая схема примерно:

блок
действия1
цикл1
действия2
цикл2
действия3
цикл3
...
действияN
циклN
конец блока



И в любой момент может сработать условие, как только оно срабатывает - закончить выполнение всего блока.
5 фев 20, 12:35    [22073611]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
Victor Nevsky
Member

Откуда:
Сообщений: 81
per, с любого места программы IF (expression = true) THEN raise notice 'return'; RETURN; END IF;
5 фев 20, 12:43    [22073623]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
per
Member

Откуда:
Сообщений: 100
Victor Nevsky
per, с любого места программы IF (expression = true) THEN raise notice 'return'; RETURN; END IF;



Верно ли я понял что это можно даже внутри цикла сделать?

А EXIT не использовать совсем?
5 фев 20, 12:48    [22073631]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
qwwq
Member

Откуда:
Сообщений: 2889
per,
охватывающий (самого верхнего уровня) блок бегин/енда поставляет вам return неявным образом. это (послабление) -- "синтаксический сахар". а его вы и хотите обойти. поместите его как сабблок внутрь более базового блока. или своими руками делайте return вместо exit из "базового" блока
5 фев 20, 12:50    [22073632]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
per
Member

Откуда:
Сообщений: 100
Victor Nevsky, проверил - из цикла RETURN выводит.
5 фев 20, 12:50    [22073633]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
Victor Nevsky
Member

Откуда:
Сообщений: 81
per, да
DO 
$$
<<anonymus_block>>  
BEGIN 
  <<ablock>>
  DECLARE 
	count INT DEFAULT 0;
  BEGIN 
        <<loop1>> 
	LOOP
	  count = count + 1;
	  RAISE NOTICE '%', count;

          --EXIT loop1 WHEN count > 8;
	  IF (count > 9)
	  THEN
	    RETURN;
	  END IF;
	END LOOP loop1;
	
	RAISE NOTICE 'работа продолжается после выхода из цикла';	

        LOOP
		EXIT ablock WHEN count > 999;
		RAISE NOTICE 'сюда не попадаем';
		count = count + 1;
		RAISE NOTICE '%', count;
	END LOOP;

      RAISE NOTICE 'и сюда не попадаем';	
  END ablock; 
END anonymus_block ;
$$ LANGUAGE 'plpgsql'
5 фев 20, 12:55    [22073645]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
per
Member

Откуда:
Сообщений: 100
Victor Nevsky
per, да
DO 
$$
<<anonymus_block>>  
BEGIN 
  <<ablock>>
  DECLARE 
	count INT DEFAULT 0;
  BEGIN 
        <<loop1>> 
	LOOP
	  count = count + 1;
	  RAISE NOTICE '%', count;

          --EXIT loop1 WHEN count > 8;
	  IF (count > 9)
	  THEN
	    RETURN;
	  END IF;
	END LOOP loop1;
	
	RAISE NOTICE 'работа продолжается после выхода из цикла';	

        LOOP
		EXIT ablock WHEN count > 999;
		RAISE NOTICE 'сюда не попадаем';
		count = count + 1;
		RAISE NOTICE '%', count;
	END LOOP;

      RAISE NOTICE 'и сюда не попадаем';	
  END ablock; 
END anonymus_block ;
$$ LANGUAGE 'plpgsql'





Что-то все запустано как-то....

Попробую так:

EXIT убрать совсем.

В каждом действии и внутри каждого цикла проставить проверку условия и RETURN.


блок
действия1
цикл1
действия2
цикл2
действия3
цикл3
...
действияN
циклN
конец блока
5 фев 20, 12:59    [22073657]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
Victor Nevsky
Member

Откуда:
Сообщений: 81
per
...
А EXIT не использовать совсем?
нет, зависит от задачи.
5 фев 20, 13:01    [22073658]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
per
Member

Откуда:
Сообщений: 100
Victor Nevsky
per
...
А EXIT не использовать совсем?
нет, зависит от задачи.


В общем пока так работает:

в каждом действии есть проверка на условие и RETURN
в каждом цикле есть проверка на условие и EXIT

Отрабатывает корректно.

НО по структуре в принципе - непонятно.


Такой вариант нормальный?

Или лучше в цикле EXIT менять на RETURN ?
5 фев 20, 13:04    [22073663]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
Victor Nevsky
Member

Откуда:
Сообщений: 81
per

Или лучше в цикле EXIT менять на RETURN ?

откуда я знаю, может завтра у вас появятся циклы/блоки внутри циклов/блоков ... и нужно будет выйти на какой-то уровень ... а я скажу, ДА, ставьте ретурн?
5 фев 20, 13:14    [22073673]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
per
Member

Откуда:
Сообщений: 100
Victor Nevsky,


Спасибо за помощь! ;-)
5 фев 20, 13:37    [22073703]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3411
per
Victor Nevsky,


Спасибо за помощь! ;-)


ну, о чем вы, не за што
5 фев 20, 15:18    [22073920]     Ответить | Цитировать Сообщить модератору
 Re: Хмурый анонимный блок  [new]
Guzya
Member

Откуда:
Сообщений: 415
Что-то такое хотели?

DO
$$
BEGIN
  DECLARE
        trig float := 0.85;
        count int := 0;
  BEGIN
        LOOP
          count = count + 1;
          RAISE NOTICE '%', count;
          IF (trig < random())
          THEN
            RAISE NOTICE 'Return из первого цикла.';
            RETURN;
          END IF;
          EXIT WHEN count > 10;
        END LOOP;

        RAISE NOTICE 'Переходим ко второму циклу.';
        count = 0;
        LOOP
          EXIT WHEN count > 10;
          count = count + 1;
          RAISE NOTICE '%', count;
          IF (trig < random())
          THEN
            RAISE NOTICE 'Return из второго цикла.';
            RETURN;
          END IF;

        END LOOP;

  END;
  RAISE NOTICE 'Достигли конца блока.';
END;
$$ LANGUAGE 'plpgsql';
5 фев 20, 15:31    [22073947]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / PostgreSQL Ответить