Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Хмурый анонимный блок  [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]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / PostgreSQL Ответить